Tweak Cloudflare help message in WebView screen
Catches pages like what Shinigami is currently showing. Also adjusts the banner to make it look more like part of the top AppBar so it looks less like part of the webpage.
Cette révision appartient à :
Parent
540fb1bb7c
révision
c386d375de
2 fichiers modifiés avec 91 ajouts et 80 suppressions
|
@ -7,6 +7,7 @@ import android.webkit.WebView
|
||||||
import androidx.compose.foundation.clickable
|
import androidx.compose.foundation.clickable
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
|
@ -14,6 +15,8 @@ import androidx.compose.material.icons.outlined.ArrowBack
|
||||||
import androidx.compose.material.icons.outlined.ArrowForward
|
import androidx.compose.material.icons.outlined.ArrowForward
|
||||||
import androidx.compose.material.icons.outlined.Close
|
import androidx.compose.material.icons.outlined.Close
|
||||||
import androidx.compose.material3.LinearProgressIndicator
|
import androidx.compose.material3.LinearProgressIndicator
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
@ -22,8 +25,10 @@ import androidx.compose.runtime.rememberCoroutineScope
|
||||||
import androidx.compose.runtime.setValue
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.platform.LocalUriHandler
|
import androidx.compose.ui.platform.LocalUriHandler
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
import com.google.accompanist.web.AccompanistWebViewClient
|
import com.google.accompanist.web.AccompanistWebViewClient
|
||||||
import com.google.accompanist.web.LoadingState
|
import com.google.accompanist.web.LoadingState
|
||||||
import com.google.accompanist.web.WebView
|
import com.google.accompanist.web.WebView
|
||||||
|
@ -72,7 +77,7 @@ fun WebViewScreenContent(
|
||||||
super.onPageFinished(view, url)
|
super.onPageFinished(view, url)
|
||||||
scope.launch {
|
scope.launch {
|
||||||
val html = view.getHtml()
|
val html = view.getHtml()
|
||||||
showCloudflareHelp = "window._cf_chl_opt" in html
|
showCloudflareHelp = "window._cf_chl_opt" in html || "Ray ID is" in html
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,54 +108,71 @@ fun WebViewScreenContent(
|
||||||
Scaffold(
|
Scaffold(
|
||||||
topBar = {
|
topBar = {
|
||||||
Box {
|
Box {
|
||||||
AppBar(
|
Column {
|
||||||
title = state.pageTitle ?: initialTitle,
|
AppBar(
|
||||||
subtitle = currentUrl,
|
title = state.pageTitle ?: initialTitle,
|
||||||
navigateUp = onNavigateUp,
|
subtitle = currentUrl,
|
||||||
navigationIcon = Icons.Outlined.Close,
|
navigateUp = onNavigateUp,
|
||||||
actions = {
|
navigationIcon = Icons.Outlined.Close,
|
||||||
AppBarActions(
|
actions = {
|
||||||
listOf(
|
AppBarActions(
|
||||||
AppBar.Action(
|
listOf(
|
||||||
title = stringResource(R.string.action_webview_back),
|
AppBar.Action(
|
||||||
icon = Icons.Outlined.ArrowBack,
|
title = stringResource(R.string.action_webview_back),
|
||||||
onClick = {
|
icon = Icons.Outlined.ArrowBack,
|
||||||
if (navigator.canGoBack) {
|
onClick = {
|
||||||
navigator.navigateBack()
|
if (navigator.canGoBack) {
|
||||||
}
|
navigator.navigateBack()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
enabled = navigator.canGoBack,
|
||||||
|
),
|
||||||
|
AppBar.Action(
|
||||||
|
title = stringResource(R.string.action_webview_forward),
|
||||||
|
icon = Icons.Outlined.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(currentUrl) },
|
||||||
|
),
|
||||||
|
AppBar.OverflowAction(
|
||||||
|
title = stringResource(R.string.action_open_in_browser),
|
||||||
|
onClick = { onOpenInBrowser(currentUrl) },
|
||||||
|
),
|
||||||
|
AppBar.OverflowAction(
|
||||||
|
title = stringResource(R.string.pref_clear_cookies),
|
||||||
|
onClick = { onClearCookies(currentUrl) },
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
if (showCloudflareHelp) {
|
||||||
|
Surface(
|
||||||
|
modifier = Modifier.padding(8.dp),
|
||||||
|
) {
|
||||||
|
WarningBanner(
|
||||||
|
textRes = R.string.information_cloudflare_help,
|
||||||
|
modifier = Modifier
|
||||||
|
.clip(MaterialTheme.shapes.small)
|
||||||
|
.clickable {
|
||||||
|
uriHandler.openUri("https://tachiyomi.org/docs/guides/troubleshooting/#cloudflare")
|
||||||
},
|
},
|
||||||
enabled = navigator.canGoBack,
|
)
|
||||||
),
|
}
|
||||||
AppBar.Action(
|
}
|
||||||
title = stringResource(R.string.action_webview_forward),
|
}
|
||||||
icon = Icons.Outlined.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(currentUrl) },
|
|
||||||
),
|
|
||||||
AppBar.OverflowAction(
|
|
||||||
title = stringResource(R.string.action_open_in_browser),
|
|
||||||
onClick = { onOpenInBrowser(currentUrl) },
|
|
||||||
),
|
|
||||||
AppBar.OverflowAction(
|
|
||||||
title = stringResource(R.string.pref_clear_cookies),
|
|
||||||
onClick = { onClearCookies(currentUrl) },
|
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
when (val loadingState = state.loadingState) {
|
when (val loadingState = state.loadingState) {
|
||||||
is LoadingState.Initializing -> LinearProgressIndicator(
|
is LoadingState.Initializing -> LinearProgressIndicator(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
|
@ -168,38 +190,27 @@ fun WebViewScreenContent(
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
) { contentPadding ->
|
) { contentPadding ->
|
||||||
Column(
|
WebView(
|
||||||
modifier = Modifier.padding(contentPadding),
|
state = state,
|
||||||
) {
|
modifier = Modifier
|
||||||
if (showCloudflareHelp) {
|
.fillMaxSize()
|
||||||
WarningBanner(
|
.padding(contentPadding),
|
||||||
textRes = R.string.information_cloudflare_help,
|
navigator = navigator,
|
||||||
modifier = Modifier.clickable {
|
onCreated = { webView ->
|
||||||
uriHandler.openUri("https://tachiyomi.org/docs/guides/troubleshooting/#cloudflare")
|
webView.setDefaultSettings()
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
WebView(
|
// Debug mode (chrome://inspect/#devices)
|
||||||
state = state,
|
if (BuildConfig.DEBUG &&
|
||||||
modifier = Modifier.weight(1f),
|
0 != webView.context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE
|
||||||
navigator = navigator,
|
) {
|
||||||
onCreated = { webView ->
|
WebView.setWebContentsDebuggingEnabled(true)
|
||||||
webView.setDefaultSettings()
|
}
|
||||||
|
|
||||||
// Debug mode (chrome://inspect/#devices)
|
headers["user-agent"]?.let {
|
||||||
if (BuildConfig.DEBUG &&
|
webView.settings.userAgentString = it
|
||||||
0 != webView.context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE
|
}
|
||||||
) {
|
},
|
||||||
WebView.setWebContentsDebuggingEnabled(true)
|
client = webClient,
|
||||||
}
|
)
|
||||||
|
|
||||||
headers["user-agent"]?.let {
|
|
||||||
webView.settings.userAgentString = it
|
|
||||||
}
|
|
||||||
},
|
|
||||||
client = webClient,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Référencer dans un nouveau ticket