@@ -2,6 +2,7 @@ package com.flipcash.app.auth.internal.credentials
22
33import android.content.Context
44import androidx.credentials.CreatePasswordRequest
5+ import androidx.credentials.Credential
56import androidx.credentials.CredentialManager
67import androidx.credentials.GetCredentialRequest
78import androidx.credentials.GetPasswordOption
@@ -54,6 +55,8 @@ class PassphraseCredentialManager @Inject constructor(
5455
5556 private val credentialManager = CredentialManager .create(context)
5657
58+ private val credentialLookupCache = mutableMapOf<String , PasswordCredential >()
59+
5760 private val dataScope: CoroutineScope = CoroutineScope (SupervisorJob () + Dispatchers .IO )
5861
5962 private val storage = PreferenceDataStoreFactory .create(
@@ -103,6 +106,7 @@ class PassphraseCredentialManager @Inject constructor(
103106
104107 suspend fun login (
105108 entropy : String ,
109+ fromSelection : Boolean = false,
106110 ): Result <AccountMetadata > {
107111 userManager.establish(entropy)
108112 userManager.set(AuthState .LoggedInAwaitingUser )
@@ -113,35 +117,41 @@ class PassphraseCredentialManager @Inject constructor(
113117 return Result .success(selectedMetadata)
114118 }
115119
116- // Check existing credential
117- val userId = getUserId(entropy)
118- val existingCredential = getCredentialByEntropy(entropy, userId)
120+ if (! fromSelection) {
121+ // Check existing credential
122+ val userId = getUserId(entropy)
123+ val existingCredential =
124+ credentialLookupCache[entropy] ? : getCredentialByEntropy(entropy, userId)
125+
126+ if (existingCredential != null ) {
127+ val metadata = getMetadata(userId.orEmpty())?.copy(isUnregistered = false )
128+ ? : AccountMetadata (
129+ userId.orEmpty(),
130+ entropy,
131+ isUnregistered = false
132+ )
119133
120- if (existingCredential != null ) {
121- val metadata = getMetadata(userId.orEmpty())?.copy(isUnregistered = false )
122- ? : AccountMetadata (
123- userId.orEmpty(),
124- entropy,
125- isUnregistered = false
134+ storeMetadata(metadata, isSelected = true )
135+ updateUserManager(
136+ Base58 .decode(existingCredential.password).toList(),
137+ AuthState .LoggedIn
126138 )
127139
128- storeMetadata(metadata, isSelected = true )
129- updateUserManager(
130- Base58 .decode(existingCredential.password).toList(),
131- AuthState .LoggedIn
132- )
133- return Result .success(metadata)
134- }
140+ credentialLookupCache.clear()
135141
136- // Check fallback userId
137- if (userId != null ) {
138- storeCredential(entropy, Base58 .decode(userId).toList())
139- storage.edit { it.remove(userIdKey(entropy)) }
142+ return Result .success(metadata)
143+ }
140144
141- val metadata = AccountMetadata (userId, entropy, isUnregistered = false )
142- storeMetadata(metadata, isSelected = true )
143- updateUserManager(Base58 .decode(userId).toList(), AuthState .LoggedIn )
144- return Result .success(metadata)
145+ // Check fallback userId
146+ if (userId != null ) {
147+ storeCredential(entropy, Base58 .decode(userId).toList())
148+ storage.edit { it.remove(userIdKey(entropy)) }
149+
150+ val metadata = AccountMetadata (userId, entropy, isUnregistered = false )
151+ storeMetadata(metadata, isSelected = true )
152+ updateUserManager(Base58 .decode(userId).toList(), AuthState .LoggedIn )
153+ return Result .success(metadata)
154+ }
145155 }
146156
147157 // Non-existent credential - check with backend
@@ -155,7 +165,10 @@ class PassphraseCredentialManager @Inject constructor(
155165
156166 val userIdBytes = backendResult.getOrNull()!!
157167 val userIdStr = userIdBytes.base58
158- storeCredential(entropy, userIdBytes)
168+
169+ if (! fromSelection) {
170+ storeCredential(entropy, userIdBytes)
171+ }
159172
160173 val metadata = AccountMetadata (userIdStr, entropy, isUnregistered = false )
161174 storeMetadata(metadata, isSelected = true )
@@ -184,6 +197,7 @@ class PassphraseCredentialManager @Inject constructor(
184197 .replace(Regex (" (\\ s)+" ), " " )
185198 .lowercase(Locale .getDefault()).split(" " )
186199 val mnemonic = MnemonicPhrase .newInstance(words)!!
200+ credentialLookupCache[mnemonic.wordString] = credential
187201 Result .success(mnemonic)
188202 } catch (e: Exception ) {
189203 when (e) {
0 commit comments