mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01:00 
			
		
		
		
	WebViewScreen: Use Scaffold (#7958)
This commit is contained in:
		| @@ -4,9 +4,8 @@ import android.content.pm.ApplicationInfo | ||||
| import android.webkit.WebResourceRequest | ||||
| import android.webkit.WebView | ||||
| import androidx.compose.foundation.layout.Box | ||||
| import androidx.compose.foundation.layout.Column | ||||
| import androidx.compose.foundation.layout.fillMaxSize | ||||
| import androidx.compose.foundation.layout.fillMaxWidth | ||||
| import androidx.compose.foundation.layout.padding | ||||
| import androidx.compose.material.icons.Icons | ||||
| import androidx.compose.material.icons.filled.ArrowBack | ||||
| import androidx.compose.material.icons.filled.ArrowForward | ||||
| @@ -14,10 +13,9 @@ import androidx.compose.material.icons.filled.Close | ||||
| import androidx.compose.material3.LinearProgressIndicator | ||||
| import androidx.compose.runtime.Composable | ||||
| import androidx.compose.runtime.remember | ||||
| import androidx.compose.ui.Alignment | ||||
| import androidx.compose.ui.Modifier | ||||
| import androidx.compose.ui.platform.LocalContext | ||||
| import androidx.compose.ui.res.stringResource | ||||
| import androidx.compose.ui.zIndex | ||||
| import com.google.accompanist.web.AccompanistWebViewClient | ||||
| import com.google.accompanist.web.LoadingState | ||||
| import com.google.accompanist.web.WebView | ||||
| @@ -25,6 +23,7 @@ import com.google.accompanist.web.rememberWebViewNavigator | ||||
| import com.google.accompanist.web.rememberWebViewState | ||||
| import eu.kanade.presentation.components.AppBar | ||||
| import eu.kanade.presentation.components.AppBarActions | ||||
| import eu.kanade.presentation.components.Scaffold | ||||
| import eu.kanade.tachiyomi.BuildConfig | ||||
| import eu.kanade.tachiyomi.R | ||||
| import eu.kanade.tachiyomi.util.system.setDefaultSettings | ||||
| @@ -39,103 +38,110 @@ fun WebViewScreen( | ||||
|     onOpenInBrowser: (String) -> Unit, | ||||
|     onClearCookies: (String) -> Unit, | ||||
| ) { | ||||
|     val context = LocalContext.current | ||||
|     val state = rememberWebViewState(url = url, additionalHttpHeaders = headers) | ||||
|     val navigator = rememberWebViewNavigator() | ||||
|  | ||||
|     Column { | ||||
|         AppBar( | ||||
|             title = state.pageTitle ?: initialTitle, | ||||
|             subtitle = state.content.getCurrentUrl(), | ||||
|             navigateUp = onUp, | ||||
|             navigationIcon = Icons.Default.Close, | ||||
|             actions = { | ||||
|                 AppBarActions( | ||||
|                     listOf( | ||||
|                         AppBar.Action( | ||||
|                             title = stringResource(R.string.action_webview_back), | ||||
|                             icon = Icons.Default.ArrowBack, | ||||
|                             onClick = { | ||||
|                                 if (navigator.canGoBack) { | ||||
|                                     navigator.navigateBack() | ||||
|                                 } | ||||
|                             }, | ||||
|                             enabled = navigator.canGoBack, | ||||
|                         ), | ||||
|                         AppBar.Action( | ||||
|                             title = stringResource(R.string.action_webview_forward), | ||||
|                             icon = Icons.Default.ArrowForward, | ||||
|                             onClick = { | ||||
|                                 if (navigator.canGoForward) { | ||||
|                                     navigator.navigateForward() | ||||
|                                 } | ||||
|                             }, | ||||
|                             enabled = navigator.canGoForward, | ||||
|                         ), | ||||
|                         AppBar.OverflowAction( | ||||
|                             title = stringResource(R.string.action_webview_refresh), | ||||
|                             onClick = { navigator.reload() }, | ||||
|                         ), | ||||
|                         AppBar.OverflowAction( | ||||
|                             title = stringResource(R.string.action_share), | ||||
|                             onClick = { onShare(state.content.getCurrentUrl()!!) }, | ||||
|                         ), | ||||
|                         AppBar.OverflowAction( | ||||
|                             title = stringResource(R.string.action_open_in_browser), | ||||
|                             onClick = { onOpenInBrowser(state.content.getCurrentUrl()!!) }, | ||||
|                         ), | ||||
|                         AppBar.OverflowAction( | ||||
|                             title = stringResource(R.string.pref_clear_cookies), | ||||
|                             onClick = { onClearCookies(state.content.getCurrentUrl()!!) }, | ||||
|                         ), | ||||
|                     ), | ||||
|     Scaffold( | ||||
|         topBar = { | ||||
|             Box { | ||||
|                 AppBar( | ||||
|                     title = state.pageTitle ?: initialTitle, | ||||
|                     subtitle = state.content.getCurrentUrl(), | ||||
|                     navigateUp = onUp, | ||||
|                     navigationIcon = Icons.Default.Close, | ||||
|                     actions = { | ||||
|                         AppBarActions( | ||||
|                             listOf( | ||||
|                                 AppBar.Action( | ||||
|                                     title = stringResource(R.string.action_webview_back), | ||||
|                                     icon = Icons.Default.ArrowBack, | ||||
|                                     onClick = { | ||||
|                                         if (navigator.canGoBack) { | ||||
|                                             navigator.navigateBack() | ||||
|                                         } | ||||
|                                     }, | ||||
|                                     enabled = navigator.canGoBack, | ||||
|                                 ), | ||||
|                                 AppBar.Action( | ||||
|                                     title = stringResource(R.string.action_webview_forward), | ||||
|                                     icon = Icons.Default.ArrowForward, | ||||
|                                     onClick = { | ||||
|                                         if (navigator.canGoForward) { | ||||
|                                             navigator.navigateForward() | ||||
|                                         } | ||||
|                                     }, | ||||
|                                     enabled = navigator.canGoForward, | ||||
|                                 ), | ||||
|                                 AppBar.OverflowAction( | ||||
|                                     title = stringResource(R.string.action_webview_refresh), | ||||
|                                     onClick = { navigator.reload() }, | ||||
|                                 ), | ||||
|                                 AppBar.OverflowAction( | ||||
|                                     title = stringResource(R.string.action_share), | ||||
|                                     onClick = { onShare(state.content.getCurrentUrl()!!) }, | ||||
|                                 ), | ||||
|                                 AppBar.OverflowAction( | ||||
|                                     title = stringResource(R.string.action_open_in_browser), | ||||
|                                     onClick = { onOpenInBrowser(state.content.getCurrentUrl()!!) }, | ||||
|                                 ), | ||||
|                                 AppBar.OverflowAction( | ||||
|                                     title = stringResource(R.string.pref_clear_cookies), | ||||
|                                     onClick = { onClearCookies(state.content.getCurrentUrl()!!) }, | ||||
|                                 ), | ||||
|                             ), | ||||
|                         ) | ||||
|                     }, | ||||
|                 ) | ||||
|             }, | ||||
|         ) | ||||
|  | ||||
|         Box { | ||||
|             val loadingState = state.loadingState | ||||
|             if (loadingState is LoadingState.Loading) { | ||||
|                 LinearProgressIndicator( | ||||
|                     progress = loadingState.progress, | ||||
|                     modifier = Modifier | ||||
|                         .fillMaxWidth() | ||||
|                         .zIndex(1f), | ||||
|                 ) | ||||
|             } | ||||
|  | ||||
|             val webClient = remember { | ||||
|                 object : AccompanistWebViewClient() { | ||||
|                     override fun shouldOverrideUrlLoading( | ||||
|                         view: WebView?, | ||||
|                         request: WebResourceRequest?, | ||||
|                     ): Boolean { | ||||
|                         request?.let { | ||||
|                             view?.loadUrl(it.url.toString(), headers) | ||||
|                         } | ||||
|                         return super.shouldOverrideUrlLoading(view, request) | ||||
|                     } | ||||
|                 when (val loadingState = state.loadingState) { | ||||
|                     is LoadingState.Initializing -> LinearProgressIndicator( | ||||
|                         modifier = Modifier | ||||
|                             .fillMaxWidth() | ||||
|                             .align(Alignment.BottomCenter), | ||||
|                     ) | ||||
|                     is LoadingState.Loading -> LinearProgressIndicator( | ||||
|                         progress = (loadingState as? LoadingState.Loading)?.progress ?: 1f, | ||||
|                         modifier = Modifier | ||||
|                             .fillMaxWidth() | ||||
|                             .align(Alignment.BottomCenter), | ||||
|                     ) | ||||
|                     else -> {} | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             WebView( | ||||
|                 state = state, | ||||
|                 modifier = Modifier.fillMaxSize(), | ||||
|                 navigator = navigator, | ||||
|                 onCreated = { webView -> | ||||
|                     webView.setDefaultSettings() | ||||
|  | ||||
|                     // Debug mode (chrome://inspect/#devices) | ||||
|                     if (BuildConfig.DEBUG && 0 != context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE) { | ||||
|                         WebView.setWebContentsDebuggingEnabled(true) | ||||
|         }, | ||||
|     ) { contentPadding -> | ||||
|         val webClient = remember { | ||||
|             object : AccompanistWebViewClient() { | ||||
|                 override fun shouldOverrideUrlLoading( | ||||
|                     view: WebView?, | ||||
|                     request: WebResourceRequest?, | ||||
|                 ): Boolean { | ||||
|                     request?.let { | ||||
|                         view?.loadUrl(it.url.toString(), headers) | ||||
|                     } | ||||
|  | ||||
|                     headers["user-agent"]?.let { | ||||
|                         webView.settings.userAgentString = it | ||||
|                     } | ||||
|                 }, | ||||
|                 client = webClient, | ||||
|             ) | ||||
|                     return super.shouldOverrideUrlLoading(view, request) | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         WebView( | ||||
|             state = state, | ||||
|             modifier = Modifier.padding(contentPadding), | ||||
|             navigator = navigator, | ||||
|             onCreated = { webView -> | ||||
|                 webView.setDefaultSettings() | ||||
|  | ||||
|                 // Debug mode (chrome://inspect/#devices) | ||||
|                 if (BuildConfig.DEBUG && | ||||
|                     0 != webView.context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE | ||||
|                 ) { | ||||
|                     WebView.setWebContentsDebuggingEnabled(true) | ||||
|                 } | ||||
|  | ||||
|                 headers["user-agent"]?.let { | ||||
|                     webView.settings.userAgentString = it | ||||
|                 } | ||||
|             }, | ||||
|             client = webClient, | ||||
|         ) | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user