11package com.google.firebase.quickstart.auth.kotlin
22
33import android.os.Bundle
4- import android.text.TextUtils
5- import android.util.Log
64import android.view.LayoutInflater
75import android.view.View
86import android.view.ViewGroup
9- import android.widget.Toast
10- import com.google.firebase.auth.EmailAuthProvider
11- import com.google.firebase.auth.FirebaseAuth
12- import com.google.firebase.auth.FirebaseUser
13- import com.google.firebase.auth.ktx.auth
14- import com.google.firebase.ktx.Firebase
15- import com.google.firebase.quickstart.auth.R
7+ import androidx.fragment.app.viewModels
8+ import androidx.lifecycle.Lifecycle
9+ import androidx.lifecycle.lifecycleScope
10+ import androidx.lifecycle.repeatOnLifecycle
1611import com.google.firebase.quickstart.auth.databinding.FragmentAnonymousAuthBinding
12+ import kotlinx.coroutines.launch
1713
1814class AnonymousAuthFragment : BaseFragment () {
1915 private var _binding : FragmentAnonymousAuthBinding ? = null
2016 private val binding: FragmentAnonymousAuthBinding
2117 get() = _binding !!
2218
23- private lateinit var auth : FirebaseAuth
19+ private val viewModel by viewModels< AnonymousAuthViewModel >()
2420
2521 override fun onCreateView (
2622 inflater : LayoutInflater ,
@@ -35,134 +31,50 @@ class AnonymousAuthFragment : BaseFragment() {
3531 super .onViewCreated(view, savedInstanceState)
3632 setProgressBar(binding.progressBar)
3733
38- // Initialize Firebase Auth
39- auth = Firebase .auth
40-
41- // Click listeners
4234 binding.buttonAnonymousSignIn.setOnClickListener {
43- signInAnonymously()
35+ viewModel. signInAnonymously()
4436 }
37+
4538 binding.buttonAnonymousSignOut.setOnClickListener {
46- signOut()
47- }
48- binding.buttonLinkAccount.setOnClickListener {
49- linkAccount()
39+ viewModel.signOut()
5040 }
51- }
52-
53- override fun onStart () {
54- super .onStart()
55- // Check if user is signed in (non-null) and update UI accordingly.
56- val currentUser = auth.currentUser
57- updateUI(currentUser)
58- }
5941
60- private fun signInAnonymously () {
61- showProgressBar()
62- auth.signInAnonymously()
63- .addOnCompleteListener(requireActivity()) { task ->
64- if (task.isSuccessful) {
65- // Sign in success, update UI with the signed-in user's information
66- Log .d(TAG , " signInAnonymously:success" )
67- val user = auth.currentUser
68- updateUI(user)
69- } else {
70- // If sign in fails, display a message to the user.
71- Log .w(TAG , " signInAnonymously:failure" , task.exception)
72- Toast .makeText(context, " Authentication failed." ,
73- Toast .LENGTH_SHORT ).show()
74- updateUI(null )
75- }
76-
77- hideProgressBar()
78- }
79- }
80-
81- private fun signOut () {
82- auth.signOut()
83- updateUI(null )
84- }
42+ binding.buttonLinkAccount.setOnClickListener {
43+ val email = binding.fieldEmail.text.toString()
44+ val password = binding.fieldPassword.text.toString()
8545
86- private fun linkAccount () {
87- // Make sure form is valid
88- if (! validateLinkForm()) {
89- return
46+ viewModel.linkAccount(email, password)
9047 }
9148
92- // Get email and password from the form
93- val email = binding.fieldEmail.text.toString()
94- val password = binding.fieldPassword.text.toString()
49+ lifecycleScope.launch {
50+ viewLifecycleOwner.repeatOnLifecycle(Lifecycle .State .STARTED ) {
51+ viewModel.uiState.collect { uiState ->
52+ // Handle errors
53+ binding.fieldEmail.error = uiState.emailError
54+ binding.fieldPassword.error = uiState.passwordError
9555
96- // Create EmailAuthCredential with email and password
97- val credential = EmailAuthProvider .getCredential(email, password)
56+ // Display texts
57+ binding.anonymousStatusId.text = uiState.userId
58+ binding.anonymousStatusEmail.text = uiState.userEmail
9859
99- // Link the anonymous user to the email credential
100- showProgressBar()
101-
102- auth.currentUser!! .linkWithCredential(credential)
103- .addOnCompleteListener(requireActivity()) { task ->
104- if (task.isSuccessful) {
105- Log .d(TAG , " linkWithCredential:success" )
106- val user = task.result?.user
107- updateUI(user)
60+ // Toggle progress bar
61+ if (uiState.isProgressBarVisible) {
62+ showProgressBar()
10863 } else {
109- Log .w(TAG , " linkWithCredential:failure" , task.exception)
110- Toast .makeText(context, " Authentication failed." ,
111- Toast .LENGTH_SHORT ).show()
112- updateUI(null )
64+ hideProgressBar()
11365 }
11466
115- hideProgressBar()
67+ // Toggle button visibility
68+ binding.buttonAnonymousSignIn.isEnabled = uiState.isSignInEnabled
69+ binding.buttonLinkAccount.isEnabled = uiState.isLinkAccountEnabled
70+ binding.buttonAnonymousSignOut.isEnabled = uiState.isSignOutEnabled
11671 }
117- }
118-
119- private fun validateLinkForm (): Boolean {
120- var valid = true
121-
122- val email = binding.fieldEmail.text.toString()
123- if (TextUtils .isEmpty(email)) {
124- binding.fieldEmail.error = " Required."
125- valid = false
126- } else {
127- binding.fieldEmail.error = null
128- }
129-
130- val password = binding.fieldPassword.text.toString()
131- if (TextUtils .isEmpty(password)) {
132- binding.fieldPassword.error = " Required."
133- valid = false
134- } else {
135- binding.fieldPassword.error = null
136- }
137-
138- return valid
139- }
140-
141- private fun updateUI (user : FirebaseUser ? ) {
142- hideProgressBar()
143- val isSignedIn = user != null
144-
145- // Status text
146- if (isSignedIn) {
147- binding.anonymousStatusId.text = getString(R .string.id_fmt, user!! .uid)
148- binding.anonymousStatusEmail.text = getString(R .string.email_fmt, user.email)
149- } else {
150- binding.anonymousStatusId.setText(R .string.signed_out)
151- binding.anonymousStatusEmail.text = null
72+ }
15273 }
153-
154- // Button visibility
155- binding.buttonAnonymousSignIn.isEnabled = ! isSignedIn
156- binding.buttonAnonymousSignOut.isEnabled = isSignedIn
157- binding.buttonLinkAccount.isEnabled = isSignedIn
15874 }
15975
16076 override fun onDestroyView () {
16177 super .onDestroyView()
16278 _binding = null
16379 }
164-
165- companion object {
166- private const val TAG = " AnonymousAuth"
167- }
16880}
0 commit comments