Skip to content

Commit 95cb210

Browse files
committed
Replace Firebase AuthUI with credential manager
1 parent c9bbe52 commit 95cb210

File tree

5 files changed

+81
-64
lines changed

5 files changed

+81
-64
lines changed

app/dependencies/googleReleaseRuntimeClasspath.txt

+14-16
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ androidx.appcompat:appcompat-resources:1.7.0
2626
androidx.appcompat:appcompat:1.7.0
2727
androidx.arch.core:core-common:2.2.0
2828
androidx.arch.core:core-runtime:2.2.0
29-
androidx.asynclayoutinflater:asynclayoutinflater:1.0.0
3029
androidx.autofill:autofill:1.0.0
3130
androidx.browser:browser:1.8.0
3231
androidx.cardview:cardview:1.0.0
@@ -76,8 +75,8 @@ androidx.constraintlayout:constraintlayout:2.1.4
7675
androidx.coordinatorlayout:coordinatorlayout:1.1.0
7776
androidx.core:core-ktx:1.13.1
7877
androidx.core:core:1.13.1
79-
androidx.credentials:credentials-play-services-auth:1.2.0-rc01
80-
androidx.credentials:credentials:1.2.0-rc01
78+
androidx.credentials:credentials-play-services-auth:1.3.0
79+
androidx.credentials:credentials:1.3.0
8180
androidx.cursoradapter:cursoradapter:1.0.0
8281
androidx.customview:customview-poolingcontainer:1.0.0
8382
androidx.customview:customview:1.1.0
@@ -99,13 +98,10 @@ androidx.hilt:hilt-navigation-fragment:1.2.0
9998
androidx.hilt:hilt-navigation:1.2.0
10099
androidx.hilt:hilt-work:1.2.0
101100
androidx.interpolator:interpolator:1.0.0
102-
androidx.legacy:legacy-support-core-ui:1.0.0
103101
androidx.legacy:legacy-support-core-utils:1.0.0
104-
androidx.legacy:legacy-support-v4:1.0.0
105102
androidx.lifecycle:lifecycle-common-java8:2.8.3
106103
androidx.lifecycle:lifecycle-common-jvm:2.8.3
107104
androidx.lifecycle:lifecycle-common:2.8.3
108-
androidx.lifecycle:lifecycle-extensions:2.2.0
109105
androidx.lifecycle:lifecycle-livedata-core-ktx:2.8.3
110106
androidx.lifecycle:lifecycle-livedata-core:2.8.3
111107
androidx.lifecycle:lifecycle-livedata-ktx:2.8.3
@@ -160,7 +156,6 @@ com.afollestad.material-dialogs:commons:0.9.6.0
160156
com.afollestad.material-dialogs:core:0.9.6.0
161157
com.android.billingclient:billing-ktx:6.2.0
162158
com.android.billingclient:billing:6.2.0
163-
com.firebaseui:firebase-ui-auth:8.0.2
164159
com.github.Carbs0126:NumberPickerView:642c376
165160
com.github.DeweyReed:ChromeMenu:0.2.0
166161
com.github.DeweyReed:HmsPickerView:0.2.0
@@ -181,20 +176,20 @@ com.google.android.datatransport:transport-backend-cct:3.3.0
181176
com.google.android.datatransport:transport-runtime:3.3.0
182177
com.google.android.flexbox:flexbox:3.0.0
183178
com.google.android.gms:play-services-auth-api-phone:18.0.2
184-
com.google.android.gms:play-services-auth-base:18.0.4
185-
com.google.android.gms:play-services-auth:20.7.0
179+
com.google.android.gms:play-services-auth-base:18.0.10
180+
com.google.android.gms:play-services-auth:21.1.1
186181
com.google.android.gms:play-services-base:18.3.0
187-
com.google.android.gms:play-services-basement:18.3.0
188-
com.google.android.gms:play-services-fido:20.1.0
182+
com.google.android.gms:play-services-basement:18.4.0
183+
com.google.android.gms:play-services-fido:21.0.0
189184
com.google.android.gms:play-services-location:19.0.0
190185
com.google.android.gms:play-services-places-placereport:17.0.0
191-
com.google.android.gms:play-services-tasks:18.1.0
192-
com.google.android.libraries.identity.googleid:googleid:1.1.0
186+
com.google.android.gms:play-services-tasks:18.2.0
187+
com.google.android.libraries.identity.googleid:googleid:1.1.1
193188
com.google.android.material:material:1.4.0
194-
com.google.android.play:core-common:2.0.2
189+
com.google.android.play:core-common:2.0.4
195190
com.google.android.play:integrity:1.2.0
196-
com.google.android.play:review-ktx:2.0.1
197-
com.google.android.play:review:2.0.1
191+
com.google.android.play:review-ktx:2.0.2
192+
com.google.android.play:review:2.0.2
198193
com.google.android.recaptcha:recaptcha:18.4.0
199194
com.google.code.findbugs:jsr305:3.0.2
200195
com.google.dagger:dagger-lint-aar:2.52
@@ -206,12 +201,14 @@ com.google.firebase:firebase-annotations:16.2.0
206201
com.google.firebase:firebase-appcheck-interop:17.1.0
207202
com.google.firebase:firebase-appcheck:18.0.0
208203
com.google.firebase:firebase-auth-interop:20.0.0
204+
com.google.firebase:firebase-auth-ktx:23.0.0
209205
com.google.firebase:firebase-auth:23.0.0
210206
com.google.firebase:firebase-bom:33.2.0
211207
com.google.firebase:firebase-common-ktx:21.0.0
212208
com.google.firebase:firebase-common:21.0.0
213209
com.google.firebase:firebase-components:18.0.0
214210
com.google.firebase:firebase-config-interop:16.0.1
211+
com.google.firebase:firebase-crashlytics-ktx:19.0.3
215212
com.google.firebase:firebase-crashlytics:19.0.3
216213
com.google.firebase:firebase-datatransport:19.0.0
217214
com.google.firebase:firebase-encoders-json:18.0.1
@@ -221,6 +218,7 @@ com.google.firebase:firebase-installations-interop:17.2.0
221218
com.google.firebase:firebase-installations:18.0.0
222219
com.google.firebase:firebase-measurement-connector:20.0.1
223220
com.google.firebase:firebase-sessions:2.0.3
221+
com.google.firebase:firebase-storage-ktx:21.0.0
224222
com.google.firebase:firebase-storage:21.0.0
225223
com.google.guava:listenablefuture:1.0
226224
com.jakewharton.timber:timber:5.0.1

flavor-google/build.gradle

+1-3
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,9 @@ dependencies {
2828
implementation libs.billing
2929

3030
implementation platform(libs.firebase.bom)
31-
implementation libs.firebase.auth
32-
implementation libs.firebase.auth.ui
31+
implementation libs.bundles.firebase.auth
3332
implementation libs.firebase.storage
3433
implementation libs.firebase.crashlytics
35-
implementation libs.playServices.auth
3634
implementation libs.playServices.review
3735

3836
implementation libs.fastAdapter

flavor-google/src/main/java/xyz/aprildown/timer/flavor/google/backup/CloudBackupFragment.kt

+50-39
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package xyz.aprildown.timer.flavor.google.backup
22

3-
import android.app.Activity
43
import android.content.Context
54
import android.content.SharedPreferences
65
import android.graphics.Typeface
@@ -9,11 +8,12 @@ import android.os.CountDownTimer
98
import android.text.Spanned
109
import android.text.style.StyleSpan
1110
import android.view.View
12-
import androidx.activity.result.ActivityResult
13-
import androidx.activity.result.ActivityResultCallback
14-
import androidx.activity.result.contract.ActivityResultContracts
1511
import androidx.appcompat.app.AlertDialog
1612
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
1717
import androidx.hilt.navigation.fragment.hiltNavGraphViewModels
1818
import androidx.lifecycle.DefaultLifecycleObserver
1919
import androidx.lifecycle.LifecycleOwner
@@ -22,26 +22,27 @@ import androidx.navigation.fragment.findNavController
2222
import androidx.preference.Preference
2323
import androidx.preference.PreferenceFragmentCompat
2424
import androidx.preference.SwitchPreferenceCompat
25-
import com.firebase.ui.auth.AuthUI
2625
import com.github.deweyreed.tools.anko.longSnackbar
2726
import com.github.deweyreed.tools.anko.newTask
2827
import com.github.deweyreed.tools.anko.snackbar
2928
import com.github.deweyreed.tools.arch.observeEvent
3029
import com.github.deweyreed.tools.helper.IntentHelper
3130
import com.github.deweyreed.tools.helper.createChooserIntentIfDead
3231
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
3334
import com.google.android.material.dialog.MaterialAlertDialogBuilder
35+
import com.google.firebase.auth.GoogleAuthProvider
3436
import com.google.firebase.auth.ktx.auth
3537
import com.google.firebase.ktx.Firebase
3638
import com.google.firebase.storage.ktx.storage
3739
import dagger.hilt.android.AndroidEntryPoint
40+
import kotlinx.coroutines.ensureActive
3841
import kotlinx.coroutines.launch
3942
import kotlinx.coroutines.tasks.await
4043
import xyz.aprildown.timer.app.base.data.FlavorData
4144
import xyz.aprildown.timer.app.base.utils.NavigationUtils.subLevelNavigate
4245
import xyz.aprildown.timer.domain.usecases.Fruit
43-
import xyz.aprildown.timer.domain.utils.AppConfig
44-
import xyz.aprildown.timer.domain.utils.Constants
4546
import xyz.aprildown.timer.flavor.google.BillingActivity
4647
import xyz.aprildown.timer.flavor.google.R
4748
import xyz.aprildown.timer.flavor.google.backup.usecases.AutoCloudBackup
@@ -53,6 +54,7 @@ import xyz.aprildown.timer.flavor.google.showErrorDialog
5354
import xyz.aprildown.timer.flavor.google.utils.IapPromotionDialog
5455
import xyz.aprildown.timer.flavor.google.utils.causeFirstMessage
5556
import xyz.aprildown.tools.helper.safeSharedPreference
57+
import java.util.UUID
5658
import javax.inject.Inject
5759
import 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) {

flavor-google/src/main/res/values/strings.xml

+2
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,6 @@
1313

1414
<string name="backup_key_auto_cloud_backup" translatable="false">pref_auto_cloud_backup</string>
1515

16+
<string name="default_web_client_id" />
17+
1618
</resources>

gradle/libs.versions.toml

+14-6
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ androidx-navigation-ui = "androidx.navigation:navigation-ui-ktx:2.7.7"
8787

8888
androidx-work = "androidx.work:work-runtime-ktx:2.9.0"
8989

90+
androidx-crendential-core = "androidx.credentials:credentials:1.3.0"
91+
androidx-crendential-play = "androidx.credentials:credentials-play-services-auth:1.3.0"
92+
9093
compose-bom = "androidx.compose:compose-bom:2024.06.00"
9194
compose-material = { module = "androidx.compose.material3:material3" }
9295
compose-icons = { module = "androidx.compose.material:material-icons-extended" }
@@ -112,12 +115,11 @@ moshi-kotlinGen = "com.squareup.moshi:moshi-kotlin-codegen:1.15.1"
112115

113116
billing = "com.android.billingclient:billing-ktx:6.2.0"
114117
firebase_bom = "com.google.firebase:firebase-bom:33.2.0"
115-
firebase_auth = { module = "com.google.firebase:firebase-auth" }
116-
firebase_auth_ui = "com.firebaseui:firebase-ui-auth:8.0.2"
117-
firebase_storage = { module = "com.google.firebase:firebase-storage" }
118-
firebase_crashlytics = { module = "com.google.firebase:firebase-crashlytics" }
119-
playServices_auth = "com.google.android.gms:play-services-auth:20.7.0"
120-
playServices_review = "com.google.android.play:review-ktx:2.0.1"
118+
firebase_auth = { module = "com.google.firebase:firebase-auth-ktx" }
119+
firebase_storage = { module = "com.google.firebase:firebase-storage-ktx" }
120+
firebase_crashlytics = { module = "com.google.firebase:firebase-crashlytics-ktx" }
121+
playServices_googleId = "com.google.android.libraries.identity.googleid:googleid:1.1.1"
122+
playServices_review = "com.google.android.play:review-ktx:2.0.2"
121123

122124
androidJob = "com.github.DeweyReed:android-job:a04c817792"
123125
okio = "com.squareup.okio:okio:3.9.0"
@@ -173,3 +175,9 @@ compose = [
173175
"compose-liveData",
174176
"compose-constraintLayout",
175177
]
178+
firebase-auth = [
179+
"firebase_auth",
180+
"androidx-crendential-core",
181+
"androidx-crendential-play",
182+
"playServices_googleId",
183+
]

0 commit comments

Comments
 (0)