11package io.github.kdroidfilter.webview.demo
22
3- import androidx.compose.foundation.layout.BoxWithConstraints
4- import androidx.compose.foundation.layout.Column
5- import androidx.compose.foundation.layout.Row
6- import androidx.compose.foundation.layout.fillMaxHeight
7- import androidx.compose.foundation.layout.fillMaxSize
8- import androidx.compose.foundation.layout.fillMaxWidth
9- import androidx.compose.foundation.layout.heightIn
10- import androidx.compose.foundation.layout.width
113import androidx.compose.animation.AnimatedVisibility
12- import androidx.compose.material3.ExperimentalMaterial3Api
13- import androidx.compose.material3.MaterialTheme
14- import androidx.compose.material3.Surface
15- import androidx.compose.material3.VerticalDivider
16- import androidx.compose.material3.darkColorScheme
17- import androidx.compose.runtime.Composable
18- import androidx.compose.runtime.DisposableEffect
19- import androidx.compose.runtime.ExperimentalComposeApi
20- import androidx.compose.runtime.LaunchedEffect
21- import androidx.compose.runtime.getValue
22- import androidx.compose.runtime.movableContentOf
23- import androidx.compose.runtime.mutableStateListOf
24- import androidx.compose.runtime.mutableStateOf
25- import androidx.compose.runtime.remember
26- import androidx.compose.runtime.rememberCoroutineScope
27- import androidx.compose.runtime.setValue
4+ import androidx.compose.foundation.layout.*
5+ import androidx.compose.material3.*
6+ import androidx.compose.runtime.*
287import androidx.compose.ui.Modifier
298import androidx.compose.ui.unit.dp
309import io.github.kdroidfilter.webview.cookie.Cookie
31- import io.github.kdroidfilter.webview.jsbridge.IJsMessageHandler
3210import io.github.kdroidfilter.webview.jsbridge.rememberWebViewJsBridge
3311import io.github.kdroidfilter.webview.util.KLogSeverity
3412import io.github.kdroidfilter.webview.web.WebView
@@ -85,50 +63,51 @@ fun App() {
8563 backgroundColor = androidx.compose.ui.graphics.Color .White
8664 }
8765 val jsBridge = rememberWebViewJsBridge(navigator)
88- val webViewContent =
89- remember(webViewState, navigator, jsBridge) {
90- movableContentOf<Modifier > { webViewModifier ->
91- WebView (
92- state = webViewState,
93- navigator = navigator,
94- webViewJsBridge = jsBridge,
95- modifier = webViewModifier,
96- )
97- }
66+ val webViewContent = remember(webViewState, navigator, jsBridge) {
67+ movableContentOf<Modifier > { webViewModifier ->
68+ WebView (
69+ state = webViewState,
70+ navigator = navigator,
71+ webViewJsBridge = jsBridge,
72+ modifier = webViewModifier,
73+ )
9874 }
75+ }
9976
10077 var urlText by remember { mutableStateOf(" https://httpbin.org/html" ) }
10178
102- val additionalHeaders =
103- remember(customHeadersEnabled, headerName, headerValue) {
104- if (! customHeadersEnabled) return @remember emptyMap()
105- val key = headerName.trim()
106- if (key.isEmpty()) return @remember emptyMap()
107- mapOf (key to headerValue)
79+ val additionalHeaders = remember(customHeadersEnabled, headerName, headerValue) {
80+ if (! customHeadersEnabled) {
81+ return @remember emptyMap()
10882 }
83+ val key = headerName.trim()
84+ if (key.isEmpty()) {
85+ return @remember emptyMap()
86+ }
87+ mapOf (key to headerValue)
88+ }
10989
11090 LaunchedEffect (webViewState.lastLoadedUrl) {
11191 webViewState.lastLoadedUrl?.let { urlText = it }
11292 }
11393
11494 DisposableEffect (jsBridge, webViewState, scope) {
115- val handlers =
116- listOf<IJsMessageHandler >(
117- EchoHandler (onLog = ::log),
118- AppInfoHandler (onLog = ::log),
119- NavigateHandler (onLog = ::log),
120- SetCookieHandler (
121- scope = scope,
122- cookieManager = webViewState.cookieManager,
123- onLog = ::log,
124- ),
125- GetCookiesHandler (
126- scope = scope,
127- cookieManager = webViewState.cookieManager,
128- onLog = ::log,
129- ),
130- CustomHandler (onLog = ::log),
131- )
95+ val handlers = listOf (
96+ EchoHandler (onLog = ::log),
97+ AppInfoHandler (onLog = ::log),
98+ NavigateHandler (onLog = ::log),
99+ SetCookieHandler (
100+ scope = scope,
101+ cookieManager = webViewState.cookieManager,
102+ onLog = ::log,
103+ ),
104+ GetCookiesHandler (
105+ scope = scope,
106+ cookieManager = webViewState.cookieManager,
107+ onLog = ::log,
108+ ),
109+ CustomHandler (onLog = ::log),
110+ )
132111
133112 handlers.forEach(jsBridge::register)
134113 onDispose { handlers.forEach(jsBridge::unregister) }
@@ -145,6 +124,7 @@ fun App() {
145124
146125 var jsSnippet by remember {
147126 mutableStateOf(
127+ // language=javascript
148128 """
149129 (function () {
150130 const id = "composewebview-demo-banner";
@@ -209,9 +189,9 @@ fun App() {
209189
210190 AnimatedVisibility (visible = toolsVisible) {
211191 DemoToolsPanel (
212- modifier =
213- Modifier .fillMaxWidth()
214- .heightIn(max = constraintsMaxHeight * 0.65f ),
192+ modifier = Modifier
193+ .fillMaxWidth()
194+ .heightIn(max = constraintsMaxHeight * 0.65f ),
215195 isCompact = true ,
216196 webViewState = webViewState,
217197 navigator = navigator,
@@ -241,24 +221,22 @@ fun App() {
241221 cookies = cookies,
242222 onSetCookie = {
243223 val url = normalizeUrl(cookieUrlText.ifBlank { urlText })
244- val domain =
245- cookieDomain
246- .trim()
247- .ifBlank { hostFromUrl(url).orEmpty() }
248- .trim()
249- .takeIf { it.isNotBlank() }
224+ val domain = cookieDomain
225+ .trim()
226+ .ifBlank { hostFromUrl(url).orEmpty() }
227+ .trim()
228+ .takeIf { it.isNotBlank() }
250229 val path = cookiePath.trim().ifBlank { " /" }
251- val cookie =
252- Cookie (
253- name = cookieName.trim().ifBlank { " demo_cookie" },
254- value = cookieValue,
255- domain = domain,
256- path = path,
257- isSessionOnly = true ,
258- isSecure = cookieSecure,
259- isHttpOnly = cookieHttpOnly,
260- sameSite = Cookie .HTTPCookieSameSitePolicy .LAX ,
261- )
230+ val cookie = Cookie (
231+ name = cookieName.trim().ifBlank { " demo_cookie" },
232+ value = cookieValue,
233+ domain = domain,
234+ path = path,
235+ isSessionOnly = true ,
236+ isSecure = cookieSecure,
237+ isHttpOnly = cookieHttpOnly,
238+ sameSite = Cookie .HTTPCookieSameSitePolicy .LAX ,
239+ )
262240 scope.launch {
263241 webViewState.cookieManager.setCookie(url, cookie)
264242 log(" setCookie url=$url ${cookie.name} domain=${cookie.domain} path=${cookie.path} " )
@@ -298,6 +276,7 @@ fun App() {
298276 },
299277 onCallNativeFromJs = {
300278 val script =
279+ // language=javascript
301280 """
302281 if (window.kmpJsBridge && window.kmpJsBridge.callNative) {
303282 window.kmpJsBridge.callNative("echo", { text: "Hello from Kotlin (evaluateJavaScript)" }, function (data) {
0 commit comments