11package xyz.aprildown.timer.flavor.google.backup
22
3- import android.app.Activity
43import android.content.Context
54import android.content.SharedPreferences
65import android.graphics.Typeface
@@ -9,11 +8,12 @@ import android.os.CountDownTimer
98import android.text.Spanned
109import android.text.style.StyleSpan
1110import android.view.View
12- import androidx.activity.result.ActivityResult
13- import androidx.activity.result.ActivityResultCallback
14- import androidx.activity.result.contract.ActivityResultContracts
1511import androidx.appcompat.app.AlertDialog
1612import androidx.core.text.buildSpannedString
13+ import androidx.credentials.ClearCredentialStateRequest
14+ import androidx.credentials.CredentialManager
15+ import androidx.credentials.CustomCredential
16+ import androidx.credentials.GetCredentialRequest
1717import androidx.hilt.navigation.fragment.hiltNavGraphViewModels
1818import androidx.lifecycle.DefaultLifecycleObserver
1919import androidx.lifecycle.LifecycleOwner
@@ -22,26 +22,27 @@ import androidx.navigation.fragment.findNavController
2222import androidx.preference.Preference
2323import androidx.preference.PreferenceFragmentCompat
2424import androidx.preference.SwitchPreferenceCompat
25- import com.firebase.ui.auth.AuthUI
2625import com.github.deweyreed.tools.anko.longSnackbar
2726import com.github.deweyreed.tools.anko.newTask
2827import com.github.deweyreed.tools.anko.snackbar
2928import com.github.deweyreed.tools.arch.observeEvent
3029import com.github.deweyreed.tools.helper.IntentHelper
3130import com.github.deweyreed.tools.helper.createChooserIntentIfDead
3231import com.github.deweyreed.tools.helper.startActivityOrNothing
32+ import com.google.android.libraries.identity.googleid.GetSignInWithGoogleOption
33+ import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
3334import com.google.android.material.dialog.MaterialAlertDialogBuilder
35+ import com.google.firebase.auth.GoogleAuthProvider
3436import com.google.firebase.auth.ktx.auth
3537import com.google.firebase.ktx.Firebase
3638import com.google.firebase.storage.ktx.storage
3739import dagger.hilt.android.AndroidEntryPoint
40+ import kotlinx.coroutines.ensureActive
3841import kotlinx.coroutines.launch
3942import kotlinx.coroutines.tasks.await
4043import xyz.aprildown.timer.app.base.data.FlavorData
4144import xyz.aprildown.timer.app.base.utils.NavigationUtils.subLevelNavigate
4245import xyz.aprildown.timer.domain.usecases.Fruit
43- import xyz.aprildown.timer.domain.utils.AppConfig
44- import xyz.aprildown.timer.domain.utils.Constants
4546import xyz.aprildown.timer.flavor.google.BillingActivity
4647import xyz.aprildown.timer.flavor.google.R
4748import xyz.aprildown.timer.flavor.google.backup.usecases.AutoCloudBackup
@@ -53,6 +54,7 @@ import xyz.aprildown.timer.flavor.google.showErrorDialog
5354import xyz.aprildown.timer.flavor.google.utils.IapPromotionDialog
5455import xyz.aprildown.timer.flavor.google.utils.causeFirstMessage
5556import xyz.aprildown.tools.helper.safeSharedPreference
57+ import java.util.UUID
5658import javax.inject.Inject
5759import xyz.aprildown.timer.app.base.R as RBase
5860
@@ -75,11 +77,6 @@ internal class CloudBackupFragment : PreferenceFragmentCompat() {
7577
7678 private var manualBackupDialog: AlertDialog ? = null
7779
78- private val signInLauncher = registerForActivityResult(
79- ActivityResultContracts .StartActivityForResult (),
80- getSignInResultCallback()
81- )
82-
8380 override fun onCreatePreferences (savedInstanceState : Bundle ? , rootKey : String? ) {
8481 setPreferencesFromResource(R .xml.pref_cloud_back, rootKey)
8582 }
@@ -285,33 +282,41 @@ internal class CloudBackupFragment : PreferenceFragmentCompat() {
285282 }
286283
287284 private fun launchSignInFlow () {
288- signInLauncher.launch(
289- AuthUI .getInstance()
290- .createSignInIntentBuilder()
291- .setLogo(RBase .mipmap.app_icon_square)
292- .setTosAndPrivacyPolicyUrls(
293- Constants .getTermsOfServiceLink(),
294- Constants .getPrivacyPolicyLink()
295- )
296- .setAvailableProviders(
297- mutableListOf<AuthUI .IdpConfig >().apply {
298- add(AuthUI .IdpConfig .GoogleBuilder ().build())
299- if (AppConfig .openDebug) {
300- add(AuthUI .IdpConfig .EmailBuilder ().build())
301- }
285+ val context = requireContext()
286+ lifecycleScope.launch {
287+ try {
288+ val result = CredentialManager .create(context)
289+ .getCredential(
290+ context,
291+ GetCredentialRequest .Builder ()
292+ .addCredentialOption(
293+ GetSignInWithGoogleOption .Builder (
294+ context.getString(R .string.default_web_client_id)
295+ )
296+ .setNonce(UUID .randomUUID().toString())
297+ .build()
298+ )
299+ .build()
300+ )
301+ val credential = result.credential
302+ if (credential is CustomCredential &&
303+ credential.type == GoogleIdTokenCredential .TYPE_GOOGLE_ID_TOKEN_CREDENTIAL
304+ ) {
305+ val googleIdTokenCredential =
306+ GoogleIdTokenCredential .createFrom(credential.data)
307+ val idToken = googleIdTokenCredential.idToken
308+ Firebase .auth.signInWithCredential(
309+ GoogleAuthProvider .getCredential(idToken, null )
310+ ).await()
311+ onAccountPaymentChanged()
312+ if (Firebase .auth.currentUser != null ) {
313+ viewModel.tryToSetUpForNewSubscriber()
302314 }
303- )
304- .build()
305- )
306- }
307-
308- private fun getSignInResultCallback (): ActivityResultCallback <ActivityResult > {
309- return ActivityResultCallback { result ->
310- if (result.resultCode == Activity .RESULT_OK ) {
311- onAccountPaymentChanged()
312- if (Firebase .auth.currentUser != null ) {
313- viewModel.tryToSetUpForNewSubscriber()
314315 }
316+ } catch (e: Exception ) {
317+ ensureActive()
318+ e.printStackTrace()
319+ requireView().longSnackbar(e.localizedMessage?.toString().toString())
315320 }
316321 }
317322 }
@@ -345,7 +350,10 @@ internal class CloudBackupFragment : PreferenceFragmentCompat() {
345350 .show()
346351 viewLifecycleOwner.lifecycleScope.launch {
347352 try {
348- AuthUI .getInstance().signOut(context).await()
353+ Firebase .auth.signOut()
354+ CredentialManager .create(context).clearCredentialState(
355+ ClearCredentialStateRequest ()
356+ )
349357 CloudBackup .cancel(context, currentBackupState)
350358 onAccountPaymentChanged()
351359 } catch (e: Exception ) {
@@ -395,7 +403,10 @@ internal class CloudBackupFragment : PreferenceFragmentCompat() {
395403
396404 viewLifecycleOwner.lifecycleScope.launch {
397405 try {
398- AuthUI .getInstance().delete(context).await()
406+ Firebase .auth.currentUser?.delete()?.await()
407+ CredentialManager .create(context).clearCredentialState(
408+ ClearCredentialStateRequest ()
409+ )
399410 CloudBackup .cancel(context, currentBackupState)
400411 onAccountPaymentChanged()
401412 } catch (e: Exception ) {
0 commit comments