Skip to content

Commit 5643ac6

Browse files
Mino5531Long Yang Paffrath
andauthored
[Android] Fix crash regression and no browser crash (#190)
* Fix crash regression and no browser crash * Grammar --------- Co-authored-by: Long Yang Paffrath <lypaffrath@dfn.de>
1 parent 303326e commit 5643ac6

2 files changed

Lines changed: 26 additions & 15 deletions

File tree

flutter_web_auth_2/android/src/main/kotlin/com/linusu/flutter_web_auth_2/AuthenticationManagementActivity.kt

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class AuthenticationManagementActivity : ComponentActivity() {
3535
private var authStarted: Boolean = false
3636
private lateinit var authenticationUri: Uri
3737
private var intentFlags: Int = 0
38-
private lateinit var targetPackage: String
38+
private var targetPackage: String? = null
3939
private var preferEphemeral: Boolean = false
4040
private lateinit var callbackScheme: String
4141
private var callbackHost: String? = null
@@ -107,14 +107,24 @@ class AuthenticationManagementActivity : ComponentActivity() {
107107
val intent = intentBuilder.build()
108108

109109
intent.intent.addFlags(intentFlags)
110-
intent.intent.setPackage(targetPackage)
110+
if(targetPackage != null){
111+
intent.intent.setPackage(targetPackage)
112+
}
111113

112-
if (callbackScheme == "https" && callbackHost != null && callbackPath != null) {
113-
Log.d(LOG_TAG, "Using https host and path: $callbackHost, $callbackPath")
114-
intent.launch(this, authLauncher, authenticationUri, callbackHost!!, callbackPath!!)
115-
} else {
116-
Log.d(LOG_TAG, "Using custom scheme: $callbackScheme")
117-
intent.launch(this, authLauncher, authenticationUri, callbackScheme)
114+
try{
115+
if (callbackScheme == "https" && callbackHost != null && callbackPath != null) {
116+
Log.d(LOG_TAG, "Using https host and path: $callbackHost, $callbackPath")
117+
intent.launch(this, authLauncher, authenticationUri, callbackHost!!, callbackPath!!)
118+
} else {
119+
Log.d(LOG_TAG, "Using custom scheme: $callbackScheme")
120+
intent.launch(this, authLauncher, authenticationUri, callbackScheme)
121+
}
122+
} catch (e: android.content.ActivityNotFoundException){
123+
Log.e(LOG_TAG,"Failed to start authentication. No browser available (Activity not found)")
124+
val callback = FlutterWebAuth2Plugin.callbacks[callbackScheme]
125+
callback?.error("NO_BROWSER","No valid browser available for authentication.",e.message)
126+
FlutterWebAuth2Plugin.callbacks.remove(callbackScheme)
127+
finish()
118128
}
119129

120130
authStarted = true
@@ -129,8 +139,8 @@ class AuthenticationManagementActivity : ComponentActivity() {
129139

130140
fun shouldUseLegacySystem(): Boolean {
131141

132-
if (!preferEphemeral) return false
133-
val packageMajorVersion = getInstalledVersion(targetPackage)?.substringBefore(".")?.toIntOrNull() ?: 0
142+
if (!preferEphemeral || targetPackage == null) return false
143+
val packageMajorVersion = getInstalledVersion(targetPackage!!)?.substringBefore(".")?.toIntOrNull() ?: 0
134144
Log.d(LOG_TAG, "Chosen package: $targetPackage with version: $packageMajorVersion")
135145

136146
val chromePackages = setOf(
@@ -180,7 +190,7 @@ class AuthenticationManagementActivity : ComponentActivity() {
180190
state.getParcelable(KEY_AUTH_URI)
181191
} ?: throw IllegalStateException("Authentication URI is null")
182192
intentFlags = state.getInt(KEY_AUTH_OPTION_INTENT_FLAGS, 0)
183-
targetPackage = state.getString(KEY_AUTH_OPTION_TARGET_PACKAGE)!!
193+
targetPackage = state.getString(KEY_AUTH_OPTION_TARGET_PACKAGE)
184194
preferEphemeral = state.getBoolean(KEY_AUTH_OPTION_PREFER_EPHEMERAL, false)
185195
callbackScheme = state.getString(KEY_AUTH_CALLBACK_SCHEME)!!
186196
callbackHost = state.getString(KEY_AUTH_CALLBACK_HOST)

flutter_web_auth_2/android/src/main/kotlin/com/linusu/flutter_web_auth_2/FlutterWebAuth2Plugin.kt

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ class FlutterWebAuth2Plugin(
9393
* 1. Custom Browser Order (if supported)
9494
* 2. default Browser
9595
* 3. Installed Browsers (if supported)
96-
* 4. Chrome (last fallback)
96+
* 4. null (System backup aka. some obscure browser that may work)
9797
*/
98-
private fun findTargetBrowserPackageName(options: Map<String, Any>): String {
98+
private fun findTargetBrowserPackageName(options: Map<String, Any>): String? {
9999
val context = requireNotNull(context) { "Context is null" }
100100

101101
val selectedPackage = (options["customTabsPackageOrder"] as? Iterable<*>)
@@ -115,8 +115,9 @@ class FlutterWebAuth2Plugin(
115115
// Check installed browser
116116
val matchedBrowser = getInstalledBrowsers().firstOrNull { isSupportCustomTabs(it) }
117117

118-
// Safely fall back on Chrome just in case
119-
return matchedBrowser ?: PackageNames.CHROME_STABLE
118+
// Don't fall back to Chrome here. It is not installed anyway because it would already be in matchedBrowser.
119+
// Instead, fall back to null so we can use the system backup (if one is available).
120+
return matchedBrowser
120121
}
121122

122123
private fun getInstalledBrowsers(): List<String> {

0 commit comments

Comments
 (0)