Make calendar WebViews edge-to-edge

close #9699
This commit is contained in:
bir 2025-11-21 10:32:37 +01:00 committed by hrb-hub
parent 74f821bcd2
commit aec9f0ae5d
2 changed files with 42 additions and 2 deletions

View file

@ -18,7 +18,7 @@ android {
compileSdk = 36
applicationId = "de.tutao.calendar"
minSdk = 26
targetSdk = 35
targetSdk = 36
versionCode = 209
versionName = "315.251202.0"

View file

@ -37,7 +37,11 @@ import androidx.annotation.RequiresPermission
import androidx.browser.customtabs.CustomTabsIntent
import androidx.core.content.ContextCompat
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.ViewCompat
import androidx.core.view.ViewCompat.setSystemGestureExclusionRects
import androidx.core.view.WindowInsetsCompat.Type.displayCutout
import androidx.core.view.WindowInsetsCompat.Type.ime
import androidx.core.view.WindowInsetsCompat.Type.systemBars
import androidx.core.view.doOnLayout
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.Lifecycle
@ -65,6 +69,7 @@ import de.tutao.tutashared.ipc.MobileFacadeSendDispatcher
import de.tutao.tutashared.ipc.SqlCipherFacade
import de.tutao.tutashared.offline.AndroidSqlCipherFacade
import de.tutao.tutashared.push.SseStorage
import de.tutao.tutashared.toDp
import de.tutao.tutashared.toPx
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@ -155,7 +160,8 @@ class MainActivity : FragmentActivity() {
themeFacade = AndroidThemeFacade(this, this)
sqlCipherFacade = AndroidSqlCipherFacade(this)
commonSystemFacade = AndroidCommonSystemFacade(this, sqlCipherFacade, fileFacade.tempDir, NetworkUtils.defaultClient)
commonSystemFacade =
AndroidCommonSystemFacade(this, sqlCipherFacade, fileFacade.tempDir, NetworkUtils.defaultClient)
val webauthnFacade = AndroidWebauthnFacade(this, ipcJson)
@ -215,6 +221,34 @@ class MainActivity : FragmentActivity() {
webView.clearCache(true)
ViewCompat.setOnApplyWindowInsetsListener(webView) { _, windowInsets ->
// Retrieve insets as raw pixels
val safeDrawingInsets = windowInsets.getInsets(
//we are handling keyboard separately below
systemBars() or displayCutout()
)
val imeHeight = windowInsets.getInsets(ime()).bottom
lifecycleScope.launch {
mobileFacade.keyboardSizeChanged(imeHeight.toDp())
}
// Convert raw pixels to density independent pixels
val top = safeDrawingInsets.top.toDp()
val right = safeDrawingInsets.right.toDp()
val bottom = safeDrawingInsets.bottom.toDp()
val left = safeDrawingInsets.left.toDp()
val safeAreaJs = """
document.documentElement.style.setProperty('--safe-area-inset-left', '${left}px');
document.documentElement.style.setProperty('--safe-area-inset-right', '${right}px');
document.documentElement.style.setProperty('--safe-area-inset-top', '${top}px');
document.documentElement.style.setProperty('--safe-area-inset-bottom', '${bottom}px');
""".trimIndent()
webView.evaluateJavascript(safeAreaJs, null)
windowInsets
}
// Reject cookies by external content
CookieManager.getInstance().setAcceptCookie(false)
CookieManager.getInstance().removeAllCookies(null)
@ -236,6 +270,12 @@ class MainActivity : FragmentActivity() {
return true
}
override fun onPageFinished(view: WebView, url: String) {
super.onPageFinished(webView, url)
// dispatch insets because insets aren't applied when the webpage first loads.
webView.requestApplyInsets()
}
override fun shouldInterceptRequest(view: WebView, request: WebResourceRequest): WebResourceResponse? {
val url = request.url
return if (request.method == "OPTIONS") {