From e8d1e8c87bad6d73cdedff45d6935a9019c04850 Mon Sep 17 00:00:00 2001 From: Benjamin Vadon Date: Fri, 27 Feb 2026 13:42:43 +0100 Subject: [PATCH 1/3] fix: Retrieve user asynchronously, in order to be sure the user is well init, like if the process was killed before screen restoration # Conflicts: # app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt --- .../infomaniak/drive/ui/OnlyOfficeActivity.kt | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt index 05a891d6a5..da443f932e 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt @@ -1,6 +1,6 @@ /* * Infomaniak kDrive - Android - * Copyright (C) 2022-2025 Infomaniak Network SA + * Copyright (C) 2022-2026 Infomaniak Network SA * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -36,11 +36,13 @@ import android.webkit.ValueCallback import android.webkit.WebChromeClient import android.webkit.WebResourceRequest import android.webkit.WebView +import android.webkit.WebViewClient import androidx.activity.addCallback import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isGone +import androidx.lifecycle.lifecycleScope import androidx.webkit.WebSettingsCompat import androidx.webkit.WebSettingsCompat.FORCE_DARK_OFF import androidx.webkit.WebSettingsCompat.FORCE_DARK_ON @@ -68,48 +70,60 @@ import java.net.URL class OnlyOfficeActivity : AppCompatActivity() { private val binding by lazy { ActivityOnlyOfficeBinding.inflate(layoutInflater) } - private var filePathCallback: ValueCallback?>? = null private val pickMedia = registerForActivityResult(ActivityResultContracts.PickMultipleVisualMedia()) { uris -> filePathCallback?.onReceiveValue(uris.toTypedArray()) filePathCallback = null } - @SuppressLint("SetJavaScriptEnabled") override fun onCreate(savedInstanceState: Bundle?): Unit = with(binding) { super.onCreate(savedInstanceState) setContentView(binding.root) addComposeOverlay { TwoFactorAuthApprovalAutoManagedBottomSheet(twoFactorAuthManager) } - val url = intent.getStringExtra(ONLYOFFICE_URL_TAG)!! - val filename = intent.getStringExtra(ONLYOFFICE_FILENAME_TAG)!! - val headers = mapOf("Authorization" to "Bearer ${AccountUtils.currentUser?.apiToken?.accessToken}") - CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true) setDarkMode() - webView.apply { - settings.javaScriptEnabled = true - settings.domStorageEnabled = true - loadUrl(url, headers) - - webViewClient = object : WebViewClientCompat() { - override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { - popBackIfNeeded(request.url.toString()) - view.loadUrl(request.url.toString()) - return true - } + intent.getStringExtra(ONLYOFFICE_URL_TAG)?.let { url -> + intent.getStringExtra(ONLYOFFICE_FILENAME_TAG)?.let { fileName -> + initWebview(url, fileName) } + } ?: finish() + } + + @SuppressLint("SetJavaScriptEnabled") + fun initWebview(url: String, fileName: String) { + lifecycleScope.launch { + val headers = retrieveAuthorizationHeader() - webChromeClient = OnlyOfficeWebChromeClient() + with(binding.webView) { + settings.javaScriptEnabled = true + settings.domStorageEnabled = true + webViewClient = buildWebViewClient(headers) + webChromeClient = OnlyOfficeWebChromeClient() - setDownloadListener { url, _, _, _, _ -> - if (url.endsWith(".pdf")) sendToPrintPDF(url, filename) else openUrl(url) + setDownloadListener { url, _, _, _, _ -> + if (url.endsWith(".pdf")) sendToPrintPDF(url, fileName) else openUrl(url) + } + + loadUrl(url, headers) } } } + fun buildWebViewClient(): WebViewClient = object : WebViewClientCompat() { + override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { + popBackIfNeeded(request.url.toString()) + view.loadUrl(request.url.toString()) + return true + } + } + + private suspend fun retrieveAuthorizationHeader(): Map { + return mapOf("Authorization" to "Bearer ${AccountUtils.requestCurrentUser()?.apiToken?.accessToken}") + } + override fun onDestroy() { if (isFinishing) destroyWebView() super.onDestroy() From 0bc5d7cd5e5e07951cc9e1073076c5774648c538 Mon Sep 17 00:00:00 2001 From: Benjamin Vadon Date: Tue, 10 Mar 2026 13:08:58 +0100 Subject: [PATCH 2/3] chore: Apply feedbacks --- .../java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt index da443f932e..ae9c97f4ce 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt @@ -93,7 +93,7 @@ class OnlyOfficeActivity : AppCompatActivity() { } @SuppressLint("SetJavaScriptEnabled") - fun initWebview(url: String, fileName: String) { + private fun initWebview(url: String, fileName: String) { lifecycleScope.launch { val headers = retrieveAuthorizationHeader() @@ -112,7 +112,7 @@ class OnlyOfficeActivity : AppCompatActivity() { } } - fun buildWebViewClient(): WebViewClient = object : WebViewClientCompat() { + private fun buildWebViewClient(): WebViewClient = object : WebViewClientCompat() { override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean { popBackIfNeeded(request.url.toString()) view.loadUrl(request.url.toString()) @@ -121,7 +121,9 @@ class OnlyOfficeActivity : AppCompatActivity() { } private suspend fun retrieveAuthorizationHeader(): Map { - return mapOf("Authorization" to "Bearer ${AccountUtils.requestCurrentUser()?.apiToken?.accessToken}") + return AccountUtils.requestCurrentUser() + ?.run { mapOf("Authorization" to "Bearer ${apiToken.accessToken}") } + ?: emptyMap() } override fun onDestroy() { From 79220b670bdb5ffce0cc83893ac4a612e2d1123b Mon Sep 17 00:00:00 2001 From: Benjamin Vadon Date: Tue, 10 Mar 2026 13:25:39 +0100 Subject: [PATCH 3/3] chore: Fix rebase --- app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt index ae9c97f4ce..2811db348e 100644 --- a/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt +++ b/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt @@ -100,7 +100,7 @@ class OnlyOfficeActivity : AppCompatActivity() { with(binding.webView) { settings.javaScriptEnabled = true settings.domStorageEnabled = true - webViewClient = buildWebViewClient(headers) + webViewClient = buildWebViewClient() webChromeClient = OnlyOfficeWebChromeClient() setDownloadListener { url, _, _, _, _ ->