mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +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