1
1
package xyz.aprildown.timer.flavor.google.backup
2
2
3
- import android.app.Activity
4
3
import android.content.Context
5
4
import android.content.SharedPreferences
6
5
import android.graphics.Typeface
@@ -9,11 +8,12 @@ import android.os.CountDownTimer
9
8
import android.text.Spanned
10
9
import android.text.style.StyleSpan
11
10
import android.view.View
12
- import androidx.activity.result.ActivityResult
13
- import androidx.activity.result.ActivityResultCallback
14
- import androidx.activity.result.contract.ActivityResultContracts
15
11
import androidx.appcompat.app.AlertDialog
16
12
import androidx.core.text.buildSpannedString
13
+ import androidx.credentials.ClearCredentialStateRequest
14
+ import androidx.credentials.CredentialManager
15
+ import androidx.credentials.CustomCredential
16
+ import androidx.credentials.GetCredentialRequest
17
17
import androidx.hilt.navigation.fragment.hiltNavGraphViewModels
18
18
import androidx.lifecycle.DefaultLifecycleObserver
19
19
import androidx.lifecycle.LifecycleOwner
@@ -22,26 +22,27 @@ import androidx.navigation.fragment.findNavController
22
22
import androidx.preference.Preference
23
23
import androidx.preference.PreferenceFragmentCompat
24
24
import androidx.preference.SwitchPreferenceCompat
25
- import com.firebase.ui.auth.AuthUI
26
25
import com.github.deweyreed.tools.anko.longSnackbar
27
26
import com.github.deweyreed.tools.anko.newTask
28
27
import com.github.deweyreed.tools.anko.snackbar
29
28
import com.github.deweyreed.tools.arch.observeEvent
30
29
import com.github.deweyreed.tools.helper.IntentHelper
31
30
import com.github.deweyreed.tools.helper.createChooserIntentIfDead
32
31
import com.github.deweyreed.tools.helper.startActivityOrNothing
32
+ import com.google.android.libraries.identity.googleid.GetSignInWithGoogleOption
33
+ import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
33
34
import com.google.android.material.dialog.MaterialAlertDialogBuilder
35
+ import com.google.firebase.auth.GoogleAuthProvider
34
36
import com.google.firebase.auth.ktx.auth
35
37
import com.google.firebase.ktx.Firebase
36
38
import com.google.firebase.storage.ktx.storage
37
39
import dagger.hilt.android.AndroidEntryPoint
40
+ import kotlinx.coroutines.ensureActive
38
41
import kotlinx.coroutines.launch
39
42
import kotlinx.coroutines.tasks.await
40
43
import xyz.aprildown.timer.app.base.data.FlavorData
41
44
import xyz.aprildown.timer.app.base.utils.NavigationUtils.subLevelNavigate
42
45
import xyz.aprildown.timer.domain.usecases.Fruit
43
- import xyz.aprildown.timer.domain.utils.AppConfig
44
- import xyz.aprildown.timer.domain.utils.Constants
45
46
import xyz.aprildown.timer.flavor.google.BillingActivity
46
47
import xyz.aprildown.timer.flavor.google.R
47
48
import xyz.aprildown.timer.flavor.google.backup.usecases.AutoCloudBackup
@@ -53,6 +54,7 @@ import xyz.aprildown.timer.flavor.google.showErrorDialog
53
54
import xyz.aprildown.timer.flavor.google.utils.IapPromotionDialog
54
55
import xyz.aprildown.timer.flavor.google.utils.causeFirstMessage
55
56
import xyz.aprildown.tools.helper.safeSharedPreference
57
+ import java.util.UUID
56
58
import javax.inject.Inject
57
59
import xyz.aprildown.timer.app.base.R as RBase
58
60
@@ -75,11 +77,6 @@ internal class CloudBackupFragment : PreferenceFragmentCompat() {
75
77
76
78
private var manualBackupDialog: AlertDialog ? = null
77
79
78
- private val signInLauncher = registerForActivityResult(
79
- ActivityResultContracts .StartActivityForResult (),
80
- getSignInResultCallback()
81
- )
82
-
83
80
override fun onCreatePreferences (savedInstanceState : Bundle ? , rootKey : String? ) {
84
81
setPreferencesFromResource(R .xml.pref_cloud_back, rootKey)
85
82
}
@@ -285,33 +282,41 @@ internal class CloudBackupFragment : PreferenceFragmentCompat() {
285
282
}
286
283
287
284
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()
302
314
}
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()
314
315
}
316
+ } catch (e: Exception ) {
317
+ ensureActive()
318
+ e.printStackTrace()
319
+ requireView().longSnackbar(e.localizedMessage?.toString().toString())
315
320
}
316
321
}
317
322
}
@@ -345,7 +350,10 @@ internal class CloudBackupFragment : PreferenceFragmentCompat() {
345
350
.show()
346
351
viewLifecycleOwner.lifecycleScope.launch {
347
352
try {
348
- AuthUI .getInstance().signOut(context).await()
353
+ Firebase .auth.signOut()
354
+ CredentialManager .create(context).clearCredentialState(
355
+ ClearCredentialStateRequest ()
356
+ )
349
357
CloudBackup .cancel(context, currentBackupState)
350
358
onAccountPaymentChanged()
351
359
} catch (e: Exception ) {
@@ -395,7 +403,10 @@ internal class CloudBackupFragment : PreferenceFragmentCompat() {
395
403
396
404
viewLifecycleOwner.lifecycleScope.launch {
397
405
try {
398
- AuthUI .getInstance().delete(context).await()
406
+ Firebase .auth.currentUser?.delete()?.await()
407
+ CredentialManager .create(context).clearCredentialState(
408
+ ClearCredentialStateRequest ()
409
+ )
399
410
CloudBackup .cancel(context, currentBackupState)
400
411
onAccountPaymentChanged()
401
412
} catch (e: Exception ) {
0 commit comments