@@ -5,18 +5,20 @@ import android.os.Bundle
5
5
import android.view.LayoutInflater
6
6
import android.view.View
7
7
import android.view.ViewGroup
8
- import android.widget.Toast
8
+ import androidx.core.view.isGone
9
9
import androidx.fragment.app.Fragment
10
+ import androidx.fragment.app.viewModels
11
+ import androidx.lifecycle.Lifecycle
12
+ import androidx.lifecycle.lifecycleScope
13
+ import androidx.lifecycle.repeatOnLifecycle
10
14
import com.firebase.ui.auth.AuthUI
11
15
import com.firebase.ui.auth.FirebaseAuthUIActivityResultContract
12
16
import com.firebase.ui.auth.data.model.FirebaseAuthUIAuthenticationResult
13
- import com.google.firebase.auth.FirebaseAuth
14
- import com.google.firebase.auth.FirebaseUser
15
- import com.google.firebase.auth.ktx.auth
16
- import com.google.firebase.ktx.Firebase
17
+ import com.google.android.material.snackbar.Snackbar
17
18
import com.google.firebase.quickstart.auth.BuildConfig
18
19
import com.google.firebase.quickstart.auth.R
19
20
import com.google.firebase.quickstart.auth.databinding.FragmentFirebaseUiBinding
21
+ import kotlinx.coroutines.launch
20
22
21
23
/* *
22
24
* Demonstrate authentication using the FirebaseUI-Android library. This fragment demonstrates
@@ -26,7 +28,7 @@ import com.google.firebase.quickstart.auth.databinding.FragmentFirebaseUiBinding
26
28
*/
27
29
class FirebaseUIFragment : Fragment () {
28
30
29
- private lateinit var auth : FirebaseAuth
31
+ private val viewModel by viewModels< FirebaseUIViewModel >()
30
32
31
33
private var _binding : FragmentFirebaseUiBinding ? = null
32
34
private val binding: FragmentFirebaseUiBinding
@@ -36,7 +38,7 @@ class FirebaseUIFragment : Fragment() {
36
38
// possible customization see: https://github.com/firebase/firebaseui-android
37
39
private val signInLauncher = registerForActivityResult(
38
40
FirebaseAuthUIActivityResultContract ()
39
- ) { result -> this .onSignInResult(result)}
41
+ ) { result -> this .onSignInResult(result) }
40
42
41
43
override fun onCreateView (inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ): View {
42
44
_binding = FragmentFirebaseUiBinding .inflate(inflater, container, false )
@@ -46,62 +48,42 @@ class FirebaseUIFragment : Fragment() {
46
48
override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
47
49
super .onViewCreated(view, savedInstanceState)
48
50
49
- // Initialize Firebase Auth
50
- auth = Firebase .auth
51
-
52
51
binding.signInButton.setOnClickListener { startSignIn() }
53
- binding.signOutButton.setOnClickListener { signOut() }
54
- }
55
-
56
- override fun onStart () {
57
- super .onStart()
58
- updateUI(auth.currentUser)
52
+ binding.signOutButton.setOnClickListener { viewModel.signOut() }
53
+
54
+ lifecycleScope.launch {
55
+ viewLifecycleOwner.repeatOnLifecycle(Lifecycle .State .STARTED ) {
56
+ viewModel.uiState.collect { uiState ->
57
+ binding.status.text = uiState.status
58
+ binding.detail.text = uiState.detail
59
+
60
+ binding.signInButton.isGone = ! uiState.isSignInVisible
61
+ binding.signOutButton.isGone = uiState.isSignInVisible
62
+ }
63
+ }
64
+ }
59
65
}
60
66
61
67
private fun onSignInResult (result : FirebaseAuthUIAuthenticationResult ) {
62
68
if (result.resultCode == Activity .RESULT_OK ) {
63
69
// Sign in succeeded
64
- updateUI(auth.currentUser)
65
70
} else {
66
71
// Sign in failed
67
- Toast .makeText(context, " Sign In Failed" , Toast .LENGTH_SHORT ).show()
68
- updateUI(null )
72
+ Snackbar .make(requireView(), " Sign In Failed" , Snackbar .LENGTH_SHORT ).show()
69
73
}
74
+ viewModel.showSignedInUser()
70
75
}
71
76
72
77
private fun startSignIn () {
73
78
val intent = AuthUI .getInstance().createSignInIntentBuilder()
74
- .setIsSmartLockEnabled(! BuildConfig .DEBUG )
75
- .setAvailableProviders(listOf (AuthUI .IdpConfig .EmailBuilder ().build()))
76
- .setLogo(R .mipmap.ic_launcher)
77
- .build()
79
+ .setIsSmartLockEnabled(! BuildConfig .DEBUG )
80
+ .setAvailableProviders(listOf (AuthUI .IdpConfig .EmailBuilder ().build()))
81
+ .setLogo(R .mipmap.ic_launcher)
82
+ .build()
78
83
79
84
signInLauncher.launch(intent)
80
85
}
81
86
82
- private fun updateUI (user : FirebaseUser ? ) {
83
- if (user != null ) {
84
- // Signed in
85
- binding.status.text = getString(R .string.firebaseui_status_fmt, user.email)
86
- binding.detail.text = getString(R .string.id_fmt, user.uid)
87
-
88
- binding.signInButton.visibility = View .GONE
89
- binding.signOutButton.visibility = View .VISIBLE
90
- } else {
91
- // Signed out
92
- binding.status.setText(R .string.signed_out)
93
- binding.detail.text = null
94
-
95
- binding.signInButton.visibility = View .VISIBLE
96
- binding.signOutButton.visibility = View .GONE
97
- }
98
- }
99
-
100
- private fun signOut () {
101
- AuthUI .getInstance().signOut(requireContext())
102
- updateUI(null )
103
- }
104
-
105
87
override fun onDestroyView () {
106
88
super .onDestroyView()
107
89
_binding = null
0 commit comments