From d7487061fe3e73a514ef478d84ed021bdcc3d46e Mon Sep 17 00:00:00 2001 From: Sander van 't Veer Date: Mon, 29 Jun 2026 09:43:08 +0200 Subject: [PATCH 1/2] #170 - Switch to AnyBrowserMatcher as long as it supports custom tabs, add extra logging --- .../di/assist/AuthenticationAssistant.kt | 5 ++--- .../eduroam/geteduroam/oauth/OAuthViewModel.kt | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/java/app/eduroam/geteduroam/di/assist/AuthenticationAssistant.kt b/android/app/src/main/java/app/eduroam/geteduroam/di/assist/AuthenticationAssistant.kt index 11e3013..1461a6b 100644 --- a/android/app/src/main/java/app/eduroam/geteduroam/di/assist/AuthenticationAssistant.kt +++ b/android/app/src/main/java/app/eduroam/geteduroam/di/assist/AuthenticationAssistant.kt @@ -13,6 +13,7 @@ import net.openid.appauth.ClientAuthentication import net.openid.appauth.RegistrationRequest import net.openid.appauth.RegistrationResponse import net.openid.appauth.TokenResponse +import net.openid.appauth.browser.AnyBrowserMatcher import net.openid.appauth.browser.BrowserAllowList import net.openid.appauth.browser.VersionedBrowserMatcher import net.openid.appauth.connectivity.DefaultConnectionBuilder @@ -125,9 +126,7 @@ class AuthenticationAssistant { val builder = AppAuthConfiguration.Builder() builder.setBrowserMatcher( BrowserAllowList( - VersionedBrowserMatcher.CHROME_BROWSER, - VersionedBrowserMatcher.FIREFOX_BROWSER, - VersionedBrowserMatcher.SAMSUNG_BROWSER + AnyBrowserMatcher.INSTANCE ) ) builder.setConnectionBuilder(DefaultConnectionBuilder.INSTANCE) diff --git a/android/app/src/main/java/app/eduroam/geteduroam/oauth/OAuthViewModel.kt b/android/app/src/main/java/app/eduroam/geteduroam/oauth/OAuthViewModel.kt index 3bac9ae..bf14e7d 100644 --- a/android/app/src/main/java/app/eduroam/geteduroam/oauth/OAuthViewModel.kt +++ b/android/app/src/main/java/app/eduroam/geteduroam/oauth/OAuthViewModel.kt @@ -94,14 +94,23 @@ class OAuthViewModel @Inject constructor( } val authorizationIntent = createAuthorizationIntent(context) if (authorizationIntent != null) { + Timber.d( + "Authorization intent built, browser package selected by AppAuth: %s", + authorizationIntent.`package` ?: authorizationIntent.component?.packageName ?: "unknown" + ) uiState = UiState(OAuthStep.Initialized(authorizationIntent)) } else { + Timber.d("No authorization intent available, triggering WebView fallback") uiState = UiState(OAuthStep.WebViewFallback(configuration, repository.authRequest.first()!!.toUri())) } } catch (e: Exception) { Timber.w(e, "Unable to initialize AppAuth!") if (e is ActivityNotFoundException) { // Could not find a browser good enough to open, we continue with WebView fallback + Timber.i( + e, + "No browser allowed by AppAuth's BrowserAllowList could be resolved, triggering WebView fallback" + ) try { uiState = UiState(OAuthStep.WebViewFallback(configuration, repository.authRequest.first()!!.toUri())) return@launch @@ -150,6 +159,11 @@ class OAuthViewModel @Inject constructor( packagesSupportingCustomTabs.add(info) } } + Timber.d( + "Custom Tabs capable packages found: %s", + packagesSupportingCustomTabs.joinToString { it.activityInfo.packageName } + .ifEmpty { "none" } + ) return packagesSupportingCustomTabs } @@ -162,9 +176,11 @@ class OAuthViewModel @Inject constructor( val requestUri = currentAuthRequest.toUri() if (isCustomTabSupported(context, requestUri)) { + Timber.d("Custom Tabs supported, warming up browser and building authorization intent") val customTabIntent = warmupBrowser() return availableService.getAuthorizationRequestIntent(currentAuthRequest, customTabIntent) } else { + Timber.d("No Custom Tabs capable browser found, returning null authorization intent") return null } } From 59bfc174e430d93ac849a17d86b8bf4957c17ae2 Mon Sep 17 00:00:00 2001 From: Sander van 't Veer Date: Fri, 3 Jul 2026 15:10:15 +0200 Subject: [PATCH 2/2] Improve logging based on comments --- .../di/assist/AuthenticationAssistant.kt | 1 - .../geteduroam/oauth/OAuthViewModel.kt | 31 +++++++++++++------ 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/android/app/src/main/java/app/eduroam/geteduroam/di/assist/AuthenticationAssistant.kt b/android/app/src/main/java/app/eduroam/geteduroam/di/assist/AuthenticationAssistant.kt index 1461a6b..cc13737 100644 --- a/android/app/src/main/java/app/eduroam/geteduroam/di/assist/AuthenticationAssistant.kt +++ b/android/app/src/main/java/app/eduroam/geteduroam/di/assist/AuthenticationAssistant.kt @@ -15,7 +15,6 @@ import net.openid.appauth.RegistrationResponse import net.openid.appauth.TokenResponse import net.openid.appauth.browser.AnyBrowserMatcher import net.openid.appauth.browser.BrowserAllowList -import net.openid.appauth.browser.VersionedBrowserMatcher import net.openid.appauth.connectivity.DefaultConnectionBuilder import timber.log.Timber import kotlin.coroutines.suspendCoroutine diff --git a/android/app/src/main/java/app/eduroam/geteduroam/oauth/OAuthViewModel.kt b/android/app/src/main/java/app/eduroam/geteduroam/oauth/OAuthViewModel.kt index bf14e7d..899a94f 100644 --- a/android/app/src/main/java/app/eduroam/geteduroam/oauth/OAuthViewModel.kt +++ b/android/app/src/main/java/app/eduroam/geteduroam/oauth/OAuthViewModel.kt @@ -16,6 +16,7 @@ import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.toRoute +import app.eduroam.geteduroam.BuildConfig import app.eduroam.geteduroam.NavTypes import app.eduroam.geteduroam.R import app.eduroam.geteduroam.Route @@ -94,10 +95,14 @@ class OAuthViewModel @Inject constructor( } val authorizationIntent = createAuthorizationIntent(context) if (authorizationIntent != null) { - Timber.d( - "Authorization intent built, browser package selected by AppAuth: %s", - authorizationIntent.`package` ?: authorizationIntent.component?.packageName ?: "unknown" - ) + if (BuildConfig.DEBUG) { + // Not logged in release builds: Crashlytics uploads every Timber log, and the + // selected browser package reveals which apps the user has installed. + Timber.d( + "Authorization intent built, browser package selected by AppAuth: %s", + authorizationIntent.`package` ?: authorizationIntent.component?.packageName ?: "unknown" + ) + } uiState = UiState(OAuthStep.Initialized(authorizationIntent)) } else { Timber.d("No authorization intent available, triggering WebView fallback") @@ -109,7 +114,7 @@ class OAuthViewModel @Inject constructor( // Could not find a browser good enough to open, we continue with WebView fallback Timber.i( e, - "No browser allowed by AppAuth's BrowserAllowList could be resolved, triggering WebView fallback" + "No Custom Tabs-capable browser could be resolved, triggering WebView fallback" ) try { uiState = UiState(OAuthStep.WebViewFallback(configuration, repository.authRequest.first()!!.toUri())) @@ -159,11 +164,17 @@ class OAuthViewModel @Inject constructor( packagesSupportingCustomTabs.add(info) } } - Timber.d( - "Custom Tabs capable packages found: %s", - packagesSupportingCustomTabs.joinToString { it.activityInfo.packageName } - .ifEmpty { "none" } - ) + if (BuildConfig.DEBUG) { + // Not logged in release builds: Crashlytics uploads every Timber log, and the full + // package list reveals the user's installed-app inventory. Log only the count there. + Timber.d( + "Custom Tabs capable packages found: %s", + packagesSupportingCustomTabs.joinToString { it.activityInfo.packageName } + .ifEmpty { "none" } + ) + } else { + Timber.d("Custom Tabs capable packages found: %d", packagesSupportingCustomTabs.size) + } return packagesSupportingCustomTabs }