From bcebc1dbcf69cdd60802cf4fe35bf16d0f887443 Mon Sep 17 00:00:00 2001 From: Niko Marmeladkov Date: Mon, 5 Oct 2026 21:23:18 +0300 Subject: [PATCH] 1.2.1: clearer Google sign-in failures on microG - show the ApiException status code (e.g. DEVELOPER_ERROR 10) instead of silently falling back to the browser - do not leave the app when the picker is cancelled (12501/16) - report a missing ID token explicitly (Android OAuth client / SHA-1 hint) - version 1.2.1 --- app/build.gradle.kts | 4 ++-- .../java/dev/n1ko/nikogpt/MainActivity.kt | 20 +++++++++++++++---- app/src/main/res/values-ru/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 3108939..7aaabf6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -22,8 +22,8 @@ android { applicationId = "dev.n1ko.nikogpt" minSdk = 29 // Android 10 targetSdk = 35 - versionCode = 6 - versionName = "1.2.0" + versionCode = 7 + versionName = "1.2.1" } signingConfigs { diff --git a/app/src/main/java/dev/n1ko/nikogpt/MainActivity.kt b/app/src/main/java/dev/n1ko/nikogpt/MainActivity.kt index 78a98c2..9152d35 100644 --- a/app/src/main/java/dev/n1ko/nikogpt/MainActivity.kt +++ b/app/src/main/java/dev/n1ko/nikogpt/MainActivity.kt @@ -95,16 +95,28 @@ class MainActivity : AppCompatActivity() { private val legacySignIn: ActivityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> val link = legacyLinkMode - try { - val account = GoogleSignIn.getSignedInAccountFromIntent(result.data) + val account = try { + GoogleSignIn.getSignedInAccountFromIntent(result.data) .getResult(ApiException::class.java) - val token = account?.idToken - if (!token.isNullOrBlank()) deliverToken(token, link) else openGoogleInBrowser(link) } catch (e: ApiException) { + // 12501/16 = the user closed the picker: stay in the app. + if (e.statusCode == 12501 || e.statusCode == 16) return@registerForActivityResult + Toast.makeText(this, getString(R.string.google_error_code, e.statusCode), Toast.LENGTH_LONG).show() openGoogleInBrowser(link) + return@registerForActivityResult } catch (e: Exception) { openGoogleInBrowser(link) + return@registerForActivityResult } + val token = account?.idToken + if (token.isNullOrBlank()) { + // microG accepted the account but could not mint an ID token + // (e.g. device registration is off): say so, then fall back. + Toast.makeText(this, getString(R.string.google_no_token), Toast.LENGTH_LONG).show() + openGoogleInBrowser(link) + return@registerForActivityResult + } + deliverToken(token, link) } // Runtime microphone permission, bridged to the WebView. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 05c1c28..cec0573 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -7,6 +7,8 @@ Загрузка началась Не удалось начать загрузку Не удалось войти через Google (%1$s) + Не удалось войти через Google (код %1$d) + Google не вернул ID-токен (проверьте Android OAuth-клиент: package и SHA-1) Файл Камера diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8287ede..bfe95dc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -7,6 +7,8 @@ Download started Could not start the download Google sign-in failed (%1$s) + Google sign-in failed (code %1$d) + Google did not return an ID token (check the Android OAuth client, package and SHA-1) File Camera