Fix the firebase login.
This commit is contained in:
		
							parent
							
								
									b38d3537f6
								
							
						
					
					
						commit
						acdeb6f542
					
				
					 2 changed files with 39 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -70,7 +70,7 @@ class FirebaseRepository @Inject constructor(
 | 
			
		|||
        }
 | 
			
		||||
    }.stateIn(
 | 
			
		||||
        scope = CoroutineScope(Dispatchers.Default + Job()),
 | 
			
		||||
        started = SharingStarted.Eagerly,
 | 
			
		||||
        started = SharingStarted.Lazily,
 | 
			
		||||
        initialValue = emptyMap()
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -102,7 +102,7 @@ class FirebaseRepository @Inject constructor(
 | 
			
		|||
        }
 | 
			
		||||
    }.stateIn(
 | 
			
		||||
        scope = CoroutineScope(Dispatchers.Default + Job()),
 | 
			
		||||
        started = SharingStarted.Eagerly,
 | 
			
		||||
        started = SharingStarted.Lazily,
 | 
			
		||||
        initialValue = NetworkThrowMap(),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,10 +7,16 @@ import androidx.credentials.GetCredentialRequest
 | 
			
		|||
import androidx.lifecycle.ViewModel
 | 
			
		||||
import androidx.lifecycle.viewModelScope
 | 
			
		||||
import com.google.android.libraries.identity.googleid.GetSignInWithGoogleOption
 | 
			
		||||
import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
 | 
			
		||||
import com.google.firebase.auth.GoogleAuthProvider
 | 
			
		||||
import com.google.firebase.auth.ktx.auth
 | 
			
		||||
import com.google.firebase.ktx.Firebase
 | 
			
		||||
import com.pixelized.rplexicon.R
 | 
			
		||||
import com.pixelized.rplexicon.data.repository.authentication.FirebaseRepository
 | 
			
		||||
import dagger.hilt.android.lifecycle.HiltViewModel
 | 
			
		||||
import kotlinx.coroutines.Dispatchers
 | 
			
		||||
import kotlinx.coroutines.launch
 | 
			
		||||
import kotlinx.coroutines.tasks.await
 | 
			
		||||
import kotlinx.coroutines.withContext
 | 
			
		||||
import javax.inject.Inject
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -18,7 +24,9 @@ import javax.inject.Inject
 | 
			
		|||
 * https://developer.android.com/identity/sign-in/credential-manager-siwg
 | 
			
		||||
 */
 | 
			
		||||
@HiltViewModel
 | 
			
		||||
class AuthenticationViewModel @Inject constructor() : ViewModel() {
 | 
			
		||||
class AuthenticationViewModel @Inject constructor(
 | 
			
		||||
    private val firebaseRepository: FirebaseRepository,
 | 
			
		||||
) : ViewModel() {
 | 
			
		||||
 | 
			
		||||
    val authenticationState = mutableStateOf<AuthenticationStateUio>(
 | 
			
		||||
        AuthenticationStateUio.Initial
 | 
			
		||||
| 
						 | 
				
			
			@ -36,14 +44,38 @@ class AuthenticationViewModel @Inject constructor() : ViewModel() {
 | 
			
		|||
            .build()
 | 
			
		||||
 | 
			
		||||
        viewModelScope.launch(Dispatchers.IO) {
 | 
			
		||||
            withContext(Dispatchers.Main) {
 | 
			
		||||
                authenticationState.value = AuthenticationStateUio.Initial
 | 
			
		||||
            }
 | 
			
		||||
            try {
 | 
			
		||||
                credentialManager.getCredential(
 | 
			
		||||
                withContext(Dispatchers.Main) {
 | 
			
		||||
                    authenticationState.value = AuthenticationStateUio.Progress
 | 
			
		||||
                }
 | 
			
		||||
                // login to goole.
 | 
			
		||||
                val result = credentialManager.getCredential(
 | 
			
		||||
                    request = request,
 | 
			
		||||
                    context = activity,
 | 
			
		||||
                )
 | 
			
		||||
                // extract the token Id from the credential
 | 
			
		||||
                val tokenIdCredential = GoogleIdTokenCredential.createFrom(
 | 
			
		||||
                    data = result.credential.data,
 | 
			
		||||
                )
 | 
			
		||||
                // wrap the tokenId inside a google credential
 | 
			
		||||
                val googleIdCredential = GoogleAuthProvider.getCredential(
 | 
			
		||||
                    tokenIdCredential.idToken,
 | 
			
		||||
                    null,
 | 
			
		||||
                )
 | 
			
		||||
                // use that credential to login to firebase.
 | 
			
		||||
                val firebase = Firebase.auth.signInWithCredential(
 | 
			
		||||
                    googleIdCredential
 | 
			
		||||
                ).await()
 | 
			
		||||
                // throw if firebase login fail.
 | 
			
		||||
                if (firebase.credential == null) {
 | 
			
		||||
                    error("Fail to authenticate to firebase")
 | 
			
		||||
                }
 | 
			
		||||
                // Launch a preload collect to warm the repository flow.
 | 
			
		||||
                // Can't use Eager for that because of auth permission.
 | 
			
		||||
                launch(Dispatchers.Default) {
 | 
			
		||||
                    firebaseRepository.getAlterationStatus().collect { }
 | 
			
		||||
                }
 | 
			
		||||
                // propagate the auth success.
 | 
			
		||||
                withContext(Dispatchers.Main) {
 | 
			
		||||
                    authenticationState.value = AuthenticationStateUio.Success
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue