Skip to content

Commit

Permalink
Merge pull request #2086 from Infomaniak/display-message-zero-width-s…
Browse files Browse the repository at this point in the history
…entry

Add some sentry to better understand message display improvements that still leave some overscroll
  • Loading branch information
LunarX authored Oct 29, 2024
2 parents ab0b9c7 + c3e3e04 commit afd9dbb
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,10 @@ import android.text.format.DateUtils
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import androidx.webkit.WebViewCompat
import com.infomaniak.mail.di.IoDispatcher
import com.infomaniak.mail.utils.SearchUtils
import com.infomaniak.mail.utils.SentryDebug
import com.infomaniak.mail.utils.WebViewVersionUtils.getWebViewVersionData
import com.infomaniak.mail.utils.coroutineContext
import com.infomaniak.mail.utils.extensions.appContext
import dagger.hilt.android.lifecycle.HiltViewModel
Expand Down Expand Up @@ -66,32 +66,26 @@ class ThreadListViewModel @Inject constructor(
}

fun checkWebViewVersion(canShowWebViewOutdated: Boolean) {
val webViewPackage = WebViewCompat.getCurrentWebViewPackage(appContext)
val webViewPackageName = webViewPackage?.packageName
val versionData = getWebViewVersionData(appContext)

val (webViewVersionName, webViewMajorVersion) = webViewPackage?.versionName?.let { versionName ->
val majorVersion = runCatching {
versionName.substringBefore('.').toInt()
}.getOrDefault(defaultValue = DEFAULT_WEBVIEW_VERSION)

return@let versionName to majorVersion
} ?: (null to DEFAULT_WEBVIEW_VERSION)

val hasOutdatedMajorVersion = when (webViewPackageName) {
WEBVIEW_OFFICIAL_PACKAGE_NAME -> webViewMajorVersion < WEBVIEW_OFFICIAL_MIN_VERSION
else -> false // We'll add other package names in the future if needed here
val hasOutdatedMajorVersion = if (versionData == null)
false
else {
when (versionData.webViewPackageName) {
WEBVIEW_OFFICIAL_PACKAGE_NAME -> versionData.majorVersion < WEBVIEW_OFFICIAL_MIN_VERSION
else -> false // We'll add other package names in the future if needed here
}
}

// TODO: (23/07) Remove this log in a few weeks/month if we don't have any Sentry anymore
if (hasOutdatedMajorVersion) {
SentryDebug.sendWebViewVersionName(webViewPackageName, webViewVersionName, webViewMajorVersion)
SentryDebug.sendWebViewVersionName(versionData)
}
isWebViewOutdated.value = canShowWebViewOutdated && hasOutdatedMajorVersion
}

companion object {
private const val WEBVIEW_OFFICIAL_PACKAGE_NAME = "com.google.android.webview"
private const val WEBVIEW_OFFICIAL_MIN_VERSION = 124
private const val DEFAULT_WEBVIEW_VERSION = 0
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ import com.infomaniak.mail.data.models.Attachment
import com.infomaniak.mail.utils.LocalStorageUtils
import com.infomaniak.mail.utils.Utils
import com.infomaniak.mail.utils.Utils.runCatchingRealm
import com.infomaniak.mail.utils.WebViewVersionUtils.getWebViewVersionData
import io.sentry.Sentry
import io.sentry.SentryLevel
import java.io.ByteArrayInputStream

class MessageWebViewClient(
Expand Down Expand Up @@ -101,7 +104,28 @@ class MessageWebViewClient(

override fun onPageFinished(webView: WebView, url: String?) {
runCatchingRealm {
webView.loadUrl("javascript:removeAllProperties(); normalizeMessageWidth(${webView.width.toDp()}, '$messageUid')")
val widthInDp = webView.width.toDp()
if (widthInDp <= 0) {
val versionData = getWebViewVersionData(context)

Sentry.withScope { scope ->
scope.level = SentryLevel.WARNING
scope.setExtra("width", webView.width.toString())
scope.setExtra("measuredWidth", webView.measuredWidth.toString())
scope.setExtra("height", webView.height.toString())
scope.setExtra("measuredHeight", webView.measuredHeight.toString())
scope.setTag(
"webview version",
"${versionData?.webViewPackageName}: ${versionData?.versionName} - ${versionData?.majorVersion}"
)
scope.setTag("visibility", webView.visibility.toString())
scope.setTag("messageUid", messageUid)
scope.setTag("shouldLoadDistantResources", shouldLoadDistantResources.toString())
Sentry.captureMessage("Zero width webview detected onPageFinished which prevents message width's normalization")
}
}

webView.loadUrl("javascript:removeAllProperties(); normalizeMessageWidth($widthInDp, '$messageUid')")
onPageFinished?.invoke()
}
}
Expand Down
9 changes: 5 additions & 4 deletions app/src/main/java/com/infomaniak/mail/utils/SentryDebug.kt
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,7 @@ object SentryDebug {
fun sendOverScrolledMessage(clientWidth: Int, scrollWidth: Int, messageUid: String) {
Sentry.captureMessage("When resizing the mail with js, after zooming, it can still scroll.", SentryLevel.ERROR) { scope ->
scope.setTag("messageUid", messageUid)
scope.setTag("isClientWidthEmpty", (clientWidth <= 0).toString())
scope.setExtra("clientWidth", "$clientWidth")
scope.setExtra("scrollWidth", "$scrollWidth")
}
Expand Down Expand Up @@ -324,13 +325,13 @@ object SentryDebug {
}
}

fun sendWebViewVersionName(webViewPackageName: String?, webViewVersionName: String?, majorVersion: Int) {
fun sendWebViewVersionName(versionData: WebViewVersionUtils.WebViewVersionData?) {
Sentry.captureMessage(
"WebView version name might be null on some devices. Checking that the version name is ok.",
) { scope ->
scope.setTag("webViewPackageName", "$webViewPackageName")
scope.setTag("webViewVersionName", "$webViewVersionName")
scope.setTag("majorVersion", "$majorVersion")
scope.setTag("webViewPackageName", versionData?.webViewPackageName.toString())
scope.setTag("webViewVersionName", versionData?.versionName.toString())
scope.setTag("majorVersion", versionData?.majorVersion.toString())
}
}
//endregion
Expand Down
48 changes: 48 additions & 0 deletions app/src/main/java/com/infomaniak/mail/utils/WebViewVersionUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Infomaniak Mail - Android
* Copyright (C) 2024 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
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.infomaniak.mail.utils

import android.content.Context
import android.content.pm.PackageInfo
import androidx.webkit.WebViewCompat

object WebViewVersionUtils {
private const val DEFAULT_WEBVIEW_VERSION = 0

fun getWebViewVersionData(context: Context): WebViewVersionData? {
val webViewPackage = WebViewCompat.getCurrentWebViewPackage(context) ?: return null
val webViewPackageName = webViewPackage.packageName
val (versionName, majorVersion) = webViewPackage.getWebViewVersions()

return WebViewVersionData(versionName, majorVersion, webViewPackageName)
}

private fun PackageInfo.getWebViewVersions(): Pair<String, Int> {
val majorVersion = runCatching {
versionName.substringBefore('.').toInt()
}.getOrDefault(defaultValue = DEFAULT_WEBVIEW_VERSION)

return versionName to majorVersion
}

data class WebViewVersionData(
val versionName: String,
val majorVersion: Int,
val webViewPackageName: String,
)
}

0 comments on commit afd9dbb

Please sign in to comment.