@@ -5,20 +5,20 @@ import android.util.Log
5
5
import android.view.LayoutInflater
6
6
import android.view.View
7
7
import android.view.ViewGroup
8
- import android.widget.Toast
9
- import com.facebook.AccessToken
8
+ import androidx.core.view.isGone
9
+ import androidx.fragment.app.viewModels
10
+ import androidx.lifecycle.Lifecycle
11
+ import androidx.lifecycle.lifecycleScope
12
+ import androidx.lifecycle.repeatOnLifecycle
10
13
import com.facebook.CallbackManager
11
14
import com.facebook.FacebookCallback
12
15
import com.facebook.FacebookException
13
- import com.facebook.login.LoginManager
14
16
import com.facebook.login.LoginResult
15
- import com.google.firebase.auth.FacebookAuthProvider
16
17
import com.google.firebase.auth.FirebaseAuth
17
- import com.google.firebase.auth.FirebaseUser
18
18
import com.google.firebase.auth.ktx.auth
19
19
import com.google.firebase.ktx.Firebase
20
- import com.google.firebase.quickstart.auth.R
21
20
import com.google.firebase.quickstart.auth.databinding.FragmentFacebookBinding
21
+ import kotlinx.coroutines.launch
22
22
23
23
/* *
24
24
* Demonstrate Firebase Authentication using a Facebook access token.
@@ -31,7 +31,7 @@ class FacebookLoginFragment : BaseFragment() {
31
31
private val binding: FragmentFacebookBinding
32
32
get() = _binding !!
33
33
34
- private lateinit var callbackManager : CallbackManager
34
+ private val viewModel by viewModels< FacebookLoginViewModel >()
35
35
36
36
override fun onCreateView (inflater : LayoutInflater , container : ViewGroup ? , savedInstanceState : Bundle ? ): View {
37
37
_binding = FragmentFacebookBinding .inflate(layoutInflater, container, false )
@@ -42,85 +42,42 @@ class FacebookLoginFragment : BaseFragment() {
42
42
super .onViewCreated(view, savedInstanceState)
43
43
setProgressBar(binding.progressBar)
44
44
45
- binding.buttonFacebookSignout.setOnClickListener { signOut() }
45
+ binding.buttonFacebookSignout.setOnClickListener { viewModel. signOut() }
46
46
47
47
// Initialize Firebase Auth
48
48
auth = Firebase .auth
49
49
50
50
// Initialize Facebook Login button
51
- callbackManager = CallbackManager .Factory .create()
51
+ val callbackManager = CallbackManager .Factory .create()
52
52
53
53
binding.buttonFacebookLogin.setPermissions(" email" , " public_profile" )
54
54
binding.buttonFacebookLogin.registerCallback(callbackManager, object : FacebookCallback <LoginResult > {
55
- override fun onSuccess (loginResult : LoginResult ) {
56
- Log .d(TAG , " facebook:onSuccess:$loginResult " )
57
- handleFacebookAccessToken(loginResult .accessToken)
55
+ override fun onSuccess (result : LoginResult ) {
56
+ Log .d(TAG , " facebook:onSuccess:$result " )
57
+ viewModel. handleFacebookAccessToken(result .accessToken)
58
58
}
59
59
60
60
override fun onCancel () {
61
61
Log .d(TAG , " facebook:onCancel" )
62
- updateUI( null )
62
+ viewModel.showInitialState( )
63
63
}
64
64
65
65
override fun onError (error : FacebookException ) {
66
66
Log .d(TAG , " facebook:onError" , error)
67
- updateUI( null )
67
+ viewModel.showInitialState( )
68
68
}
69
69
})
70
- }
71
70
72
- override fun onStart () {
73
- super .onStart()
74
- // Check if user is signed in (non-null) and update UI accordingly.
75
- val currentUser = auth.currentUser
76
- updateUI(currentUser)
77
- }
71
+ lifecycleScope.launch {
72
+ viewLifecycleOwner.repeatOnLifecycle(Lifecycle .State .STARTED ) {
73
+ viewModel.uiState.collect { uiState ->
74
+ binding.status.text = uiState.status
75
+ binding.detail.text = uiState.detail
78
76
79
- private fun handleFacebookAccessToken (token : AccessToken ) {
80
- Log .d(TAG , " handleFacebookAccessToken:$token " )
81
- showProgressBar()
82
-
83
- val credential = FacebookAuthProvider .getCredential(token.token)
84
- auth.signInWithCredential(credential)
85
- .addOnCompleteListener(requireActivity()) { task ->
86
- if (task.isSuccessful) {
87
- // Sign in success, update UI with the signed-in user's information
88
- Log .d(TAG , " signInWithCredential:success" )
89
- val user = auth.currentUser
90
- updateUI(user)
91
- } else {
92
- // If sign in fails, display a message to the user.
93
- Log .w(TAG , " signInWithCredential:failure" , task.exception)
94
- Toast .makeText(context, " Authentication failed." ,
95
- Toast .LENGTH_SHORT ).show()
96
- updateUI(null )
97
- }
98
-
99
- hideProgressBar()
77
+ binding.buttonFacebookLogin.isGone = ! uiState.isSignInVisible
78
+ binding.buttonFacebookSignout.isGone = uiState.isSignInVisible
100
79
}
101
- }
102
-
103
- fun signOut () {
104
- auth.signOut()
105
- LoginManager .getInstance().logOut()
106
-
107
- updateUI(null )
108
- }
109
-
110
- private fun updateUI (user : FirebaseUser ? ) {
111
- hideProgressBar()
112
- if (user != null ) {
113
- binding.status.text = getString(R .string.facebook_status_fmt, user.displayName)
114
- binding.detail.text = getString(R .string.firebase_status_fmt, user.uid)
115
-
116
- binding.buttonFacebookLogin.visibility = View .GONE
117
- binding.buttonFacebookSignout.visibility = View .VISIBLE
118
- } else {
119
- binding.status.setText(R .string.signed_out)
120
- binding.detail.text = null
121
-
122
- binding.buttonFacebookLogin.visibility = View .VISIBLE
123
- binding.buttonFacebookSignout.visibility = View .GONE
80
+ }
124
81
}
125
82
}
126
83
@@ -130,6 +87,6 @@ class FacebookLoginFragment : BaseFragment() {
130
87
}
131
88
132
89
companion object {
133
- private const val TAG = " FacebookLogin "
90
+ private const val TAG = " FacebookLoginFragment "
134
91
}
135
92
}
0 commit comments