From b0db1c1f267f2809b40d0ccba91b86f7462e5ae3 Mon Sep 17 00:00:00 2001 From: task4233 <29667656+task4233@users.noreply.github.com> Date: Mon, 14 Sep 2026 00:34:54 +0900 Subject: [PATCH] fix: Retry restore key creation without cloud backup when E2EE is unavailable --- .../shrine/CredentialManagerUtils.kt | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Shrine/app/src/main/java/com/authentication/shrine/CredentialManagerUtils.kt b/Shrine/app/src/main/java/com/authentication/shrine/CredentialManagerUtils.kt index 7e9e8167..8c539591 100644 --- a/Shrine/app/src/main/java/com/authentication/shrine/CredentialManagerUtils.kt +++ b/Shrine/app/src/main/java/com/authentication/shrine/CredentialManagerUtils.kt @@ -40,6 +40,7 @@ import androidx.credentials.SignalUnknownCredentialRequest import androidx.credentials.exceptions.CreateCredentialException import androidx.credentials.exceptions.GetCredentialCancellationException import androidx.credentials.exceptions.publickeycredential.GetPublicKeyCredentialDomException +import androidx.credentials.exceptions.restorecredential.E2eeUnavailableException import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import com.authentication.shrine.repository.AuthRepository.Companion.RP_ID_KEY @@ -227,12 +228,23 @@ class CredentialManagerUtils @Inject constructor( return GenericCredentialManagerResponse.Error(errorMessage = passkeysEligibility.reason) } - val restoreCredentialRequest = CreateRestoreCredentialRequest(requestResult.toString()) try { - credentialResponse = credentialManager.createCredential( - context, - restoreCredentialRequest, - ) as CreateRestoreCredentialResponse + credentialResponse = try { + credentialManager.createCredential( + context, + CreateRestoreCredentialRequest(requestResult.toString()), + ) as CreateRestoreCredentialResponse + } catch (e: E2eeUnavailableException) { + // The device does not meet the cloud backup requirements, so retry locally. + // https://developer.android.com/identity/sign-in/restore-credentials#previous-device + credentialManager.createCredential( + context, + CreateRestoreCredentialRequest( + requestResult.toString(), + isCloudBackupEnabled = false, + ), + ) as CreateRestoreCredentialResponse + } } catch (e: Exception) { return GenericCredentialManagerResponse.Error(errorMessage = e.message ?: "") }