1
1
package com.google.firebase.quickstart.auth.kotlin
2
2
3
3
import android.os.Bundle
4
- import android.text.TextUtils
5
- import android.util.Log
6
4
import android.view.LayoutInflater
7
5
import android.view.View
8
6
import 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
16
11
import com.google.firebase.quickstart.auth.databinding.FragmentAnonymousAuthBinding
12
+ import kotlinx.coroutines.launch
17
13
18
14
class AnonymousAuthFragment : BaseFragment () {
19
15
private var _binding : FragmentAnonymousAuthBinding ? = null
20
16
private val binding: FragmentAnonymousAuthBinding
21
17
get() = _binding !!
22
18
23
- private lateinit var auth : FirebaseAuth
19
+ private val viewModel by viewModels< AnonymousAuthViewModel >()
24
20
25
21
override fun onCreateView (
26
22
inflater : LayoutInflater ,
@@ -35,134 +31,50 @@ class AnonymousAuthFragment : BaseFragment() {
35
31
super .onViewCreated(view, savedInstanceState)
36
32
setProgressBar(binding.progressBar)
37
33
38
- // Initialize Firebase Auth
39
- auth = Firebase .auth
40
-
41
- // Click listeners
42
34
binding.buttonAnonymousSignIn.setOnClickListener {
43
- signInAnonymously()
35
+ viewModel. signInAnonymously()
44
36
}
37
+
45
38
binding.buttonAnonymousSignOut.setOnClickListener {
46
- signOut()
47
- }
48
- binding.buttonLinkAccount.setOnClickListener {
49
- linkAccount()
39
+ viewModel.signOut()
50
40
}
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
- }
59
41
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()
85
45
86
- private fun linkAccount () {
87
- // Make sure form is valid
88
- if (! validateLinkForm()) {
89
- return
46
+ viewModel.linkAccount(email, password)
90
47
}
91
48
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
95
55
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
98
59
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()
108
63
} 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()
113
65
}
114
66
115
- hideProgressBar()
67
+ // Toggle button visibility
68
+ binding.buttonAnonymousSignIn.isEnabled = uiState.isSignInEnabled
69
+ binding.buttonLinkAccount.isEnabled = uiState.isLinkAccountEnabled
70
+ binding.buttonAnonymousSignOut.isEnabled = uiState.isSignOutEnabled
116
71
}
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
+ }
152
73
}
153
-
154
- // Button visibility
155
- binding.buttonAnonymousSignIn.isEnabled = ! isSignedIn
156
- binding.buttonAnonymousSignOut.isEnabled = isSignedIn
157
- binding.buttonLinkAccount.isEnabled = isSignedIn
158
74
}
159
75
160
76
override fun onDestroyView () {
161
77
super .onDestroyView()
162
78
_binding = null
163
79
}
164
-
165
- companion object {
166
- private const val TAG = " AnonymousAuth"
167
- }
168
80
}
0 commit comments