From b1851401f2f259d57ccf8ea4cbb2a27beb8dec34 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Sat, 10 Sep 2022 14:20:05 +0200 Subject: [PATCH] Reset connected Google account if datastore could not be read --- .../launcher2/gservices/GoogleApiHelper.kt | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/g-services/src/main/java/de/mm20/launcher2/gservices/GoogleApiHelper.kt b/g-services/src/main/java/de/mm20/launcher2/gservices/GoogleApiHelper.kt index b2e92047..56adbed2 100644 --- a/g-services/src/main/java/de/mm20/launcher2/gservices/GoogleApiHelper.kt +++ b/g-services/src/main/java/de/mm20/launcher2/gservices/GoogleApiHelper.kt @@ -20,6 +20,7 @@ import de.mm20.launcher2.crashreporter.CrashReporter import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext +import java.io.File import java.io.IOException class GoogleApiHelper private constructor(private val context: Context) { @@ -100,25 +101,38 @@ class GoogleApiHelper private constructor(private val context: Context) { } - private fun getAuthFlow(): GoogleAuthorizationCodeFlow? { + private fun getAuthFlow(throwErrors: Boolean = false): GoogleAuthorizationCodeFlow? { val configResId = getConfigResId() if (configResId == 0) return null val jsonFactory = GsonFactory.getDefaultInstance() - return GoogleAuthorizationCodeFlow.Builder( - NetHttpTransport(), - jsonFactory, - GoogleClientSecrets.load( + try { + return GoogleAuthorizationCodeFlow.Builder( + NetHttpTransport(), jsonFactory, - context.resources.openRawResource(configResId).reader() - ), - SCOPES - ) - .setCredentialDataStore( - FileDataStoreFactory(context.filesDir).getDataStore( - "google_signin" - ) + GoogleClientSecrets.load( + jsonFactory, + context.resources.openRawResource(configResId).reader() + ), + SCOPES ) - .build() + .setCredentialDataStore( + FileDataStoreFactory(context.filesDir).getDataStore( + "google_signin" + ) + ) + .build() + } catch (e: IOException) { + if (throwErrors) throw e + else { + File(context.filesDir, "google_signin").delete() + context.getSharedPreferences(PREFS, Context.MODE_PRIVATE).edit { + putString(PREF_ACCOUNT_NAME, null) + } + Log.e("MM20", "Google account has been reset because data store couldn't be readg") + CrashReporter.logException(e) + return getAuthFlow(true) + } + } } private var callback: (() -> Unit)? = null