Switch to google bottom sheet authentication.
This commit is contained in:
parent
f20fa023f6
commit
466855f1d7
1 changed files with 25 additions and 21 deletions
|
|
@ -6,7 +6,7 @@ import androidx.credentials.CredentialManager
|
|||
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.GetGoogleIdOption
|
||||
import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
|
||||
import com.google.firebase.auth.GoogleAuthProvider
|
||||
import com.google.firebase.auth.ktx.auth
|
||||
|
|
@ -16,14 +16,13 @@ import com.pixelized.rplexicon.data.repository.authentication.FirebaseRepository
|
|||
import com.pixelized.rplexicon.data.repository.character.CharacterSheetRepository
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.awaitAll
|
||||
import kotlinx.coroutines.flow.firstOrNull
|
||||
import kotlinx.coroutines.flow.collect
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.tasks.await
|
||||
import kotlinx.coroutines.withContext
|
||||
import javax.inject.Inject
|
||||
|
||||
|
||||
/**
|
||||
* https://developer.android.com/identity/sign-in/credential-manager-siwg
|
||||
*/
|
||||
|
|
@ -38,26 +37,31 @@ class AuthenticationViewModel @Inject constructor(
|
|||
)
|
||||
|
||||
fun signIn(activity: Activity) {
|
||||
val credentialManager = CredentialManager.create(context = activity)
|
||||
|
||||
val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption
|
||||
.Builder(serverClientId = activity.getString(R.string.google_sign_in_id))
|
||||
.build()
|
||||
|
||||
val request: GetCredentialRequest = GetCredentialRequest.Builder()
|
||||
.addCredentialOption(credentialOption = signInWithGoogleOption)
|
||||
.build()
|
||||
|
||||
viewModelScope.launch(Dispatchers.IO) {
|
||||
try {
|
||||
withContext(Dispatchers.Main) {
|
||||
authenticationState.value = AuthenticationStateUio.Progress
|
||||
}
|
||||
// create the credential manager
|
||||
val credentialManager = CredentialManager.create(
|
||||
context = activity,
|
||||
)
|
||||
// build the google authentication bottom sheet.
|
||||
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
|
||||
.setFilterByAuthorizedAccounts(false)
|
||||
.setAutoSelectEnabled(true)
|
||||
.setServerClientId(activity.getString(R.string.google_sign_in_id))
|
||||
.build()
|
||||
// build the request from the google Id.
|
||||
val request: GetCredentialRequest = GetCredentialRequest.Builder()
|
||||
.addCredentialOption(credentialOption = googleIdOption)
|
||||
.build()
|
||||
// login to google.
|
||||
val result = credentialManager.getCredential(
|
||||
request = request,
|
||||
context = activity,
|
||||
)
|
||||
// the google UI Took care up to now of the scrim.
|
||||
withContext(Dispatchers.Main) {
|
||||
authenticationState.value = AuthenticationStateUio.Progress
|
||||
}
|
||||
// extract the token Id from the credential
|
||||
val tokenIdCredential = GoogleIdTokenCredential.createFrom(
|
||||
data = result.credential.data,
|
||||
|
|
@ -77,13 +81,13 @@ class AuthenticationViewModel @Inject constructor(
|
|||
}
|
||||
// Launch a preload collect to warm the repository flow.
|
||||
// Can't use Eager for that because of auth permission.
|
||||
val firebaseRequest = async(Dispatchers.Default) {
|
||||
firebaseRepository.getAlterationStatus().firstOrNull()
|
||||
launch(Dispatchers.Default) {
|
||||
firebaseRepository.getAlterationStatus().collect()
|
||||
}
|
||||
val sheetRequest = async(Dispatchers.Default) {
|
||||
// prefetch the character sheet
|
||||
withContext(Dispatchers.Default) {
|
||||
sheetRepository.fetchCharacterSheet()
|
||||
}
|
||||
awaitAll(firebaseRequest, sheetRequest)
|
||||
// propagate the auth success.
|
||||
withContext(Dispatchers.Main) {
|
||||
authenticationState.value = AuthenticationStateUio.Success
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue