From 2e5ab98997aa6739829e3e627ac5432e636872bf Mon Sep 17 00:00:00 2001 From: DenBond7 Date: Wed, 26 Jan 2022 16:39:19 +0200 Subject: [PATCH] Added a retry strategy to get idToken.| #1614 --- .../HandlePasswordProtectedMsgWorker.kt | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/FlowCrypt/src/main/java/com/flowcrypt/email/jetpack/workmanager/HandlePasswordProtectedMsgWorker.kt b/FlowCrypt/src/main/java/com/flowcrypt/email/jetpack/workmanager/HandlePasswordProtectedMsgWorker.kt index 68d5ef730d..4a4e25264a 100644 --- a/FlowCrypt/src/main/java/com/flowcrypt/email/jetpack/workmanager/HandlePasswordProtectedMsgWorker.kt +++ b/FlowCrypt/src/main/java/com/flowcrypt/email/jetpack/workmanager/HandlePasswordProtectedMsgWorker.kt @@ -39,6 +39,7 @@ import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.gson.GsonBuilder import com.sun.mail.util.MailConnectException import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.delay import kotlinx.coroutines.withContext import org.bouncycastle.openpgp.PGPPublicKeyRingCollection import org.bouncycastle.openpgp.PGPSecretKeyRingCollection @@ -49,6 +50,7 @@ import java.io.InputStream import java.net.SocketException import java.util.Base64 import java.util.Properties +import java.util.concurrent.TimeUnit import javax.mail.Address import javax.mail.Message import javax.mail.MessagingException @@ -387,17 +389,22 @@ class HandlePasswordProtectedMsgWorker(context: Context, params: WorkerParameter return@withContext String(decryptionResult.content?.toByteArray() ?: byteArrayOf()) } - private suspend fun getGoogleIdToken(): String = withContext(Dispatchers.IO) { - val googleSignInClient = GoogleSignIn.getClient( - applicationContext, - GoogleApiClientHelper.generateGoogleSignInOptions() - ) - val silentSignIn = googleSignInClient.silentSignIn() - if (!silentSignIn.isSuccessful) { - throw IllegalStateException("Could not receive idToken") + private suspend fun getGoogleIdToken(retryAttempt: Int = 0): String = + withContext(Dispatchers.IO) { + val googleSignInClient = GoogleSignIn.getClient( + applicationContext, + GoogleApiClientHelper.generateGoogleSignInOptions() + ) + val silentSignIn = googleSignInClient.silentSignIn() + if (!silentSignIn.isSuccessful || silentSignIn.result.isExpired) { + if (retryAttempt <= RETRY_ATTEMPTS_COUNT_FOR_GETTING_ID_TOKEN) { + //do delay for 10 seconds and try again. Max attempts == RETRY_ATTEMPTS_COUNT_FOR_GETTING_ID_TOKEN + delay(TimeUnit.SECONDS.toMillis(10)) + return@withContext getGoogleIdToken(retryAttempt + 1) + } else throw IllegalStateException("Could not receive idToken") + } + return@withContext requireNotNull(silentSignIn.result.idToken) } - return@withContext requireNotNull(silentSignIn.result.idToken) - } private suspend fun fetchReplyToken( apiRepository: FlowcryptApiRepository, @@ -427,6 +434,7 @@ class HandlePasswordProtectedMsgWorker(context: Context, params: WorkerParameter companion object { private val TAG = HandlePasswordProtectedMsgWorker::class.java.simpleName + private const val RETRY_ATTEMPTS_COUNT_FOR_GETTING_ID_TOKEN = 6 val NAME = HandlePasswordProtectedMsgWorker::class.java.simpleName private fun genInfoDiv(replyInfo: String?) =