Skip to content
This repository was archived by the owner on Jul 2, 2025. It is now read-only.

Commit f416fc5

Browse files
1. Adapt it to MVVM architecture
2. Add AuthStateListener and oberver to lisen the change of current login status 3. Solve the coordination between async operations
1 parent b90072d commit f416fc5

File tree

6 files changed

+131
-101
lines changed

6 files changed

+131
-101
lines changed

android/canonical/app/src/main/java/com/google/samples/quickstart/canonical/LoginFragment.kt

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ import android.view.LayoutInflater
88
import android.view.View
99
import android.view.ViewGroup
1010
import androidx.fragment.app.activityViewModels
11+
import androidx.lifecycle.Observer
1112
import com.google.android.gms.common.SignInButton
13+
import com.google.samples.quickstart.canonical.SignInViewModel.Companion.FIREBASE_AUTH_WITH_GOOGLE_FAIL
14+
import com.google.samples.quickstart.canonical.SignInViewModel.Companion.FIREBASE_AUTH_WITH_GOOGLE_SUCCESSFUL
15+
import com.google.samples.quickstart.canonical.SignInViewModel.Companion.GOOGLE_SIGN_IN_UNSUCCESSFUL
1216

1317
class LoginFragment : Fragment() {
1418

@@ -41,6 +45,25 @@ class LoginFragment : Fragment() {
4145
// No other requestCode, ignore it.
4246
}
4347

48+
override fun onCreate(savedInstanceState: Bundle?) {
49+
super.onCreate(savedInstanceState)
50+
// Add login status change listener
51+
signInVM.getFirebaseAuthLogStatusLiveData().observe(this, Observer {
52+
when (it) {
53+
true -> {
54+
Log.d(LOGIN_FRAGMENT_TAG, "firebaseUser is not null")
55+
val intent = Intent(context, MainActivity::class.java)
56+
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
57+
startActivity(intent)
58+
}
59+
60+
false -> {
61+
Log.d(LOGIN_FRAGMENT_TAG, "firebaseUser is null")
62+
}
63+
}
64+
})
65+
}
66+
4467
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
4568
savedInstanceState: Bundle?): View? {
4669
// Inflate the layout for this fragment
@@ -56,9 +79,6 @@ class LoginFragment : Fragment() {
5679

5780
companion object {
5881
const val RC_SIGN_IN = 0
59-
const val GOOGLE_SIGN_IN_UNSUCCESSFUL = 1
60-
const val FIREBASE_AUTH_WITH_GOOGLE_SUCCESSFUL = 2
61-
const val FIREBASE_AUTH_WITH_GOOGLE_FAIL = 3
6282
const val LOGIN_FRAGMENT_TAG = "Login fragment"
6383
}
6484
}

android/canonical/app/src/main/java/com/google/samples/quickstart/canonical/MainActivity.kt

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@ package com.google.samples.quickstart.canonical
33
import androidx.appcompat.app.AppCompatActivity
44
import android.os.Bundle
55
import android.util.Log
6+
import androidx.activity.viewModels
67
import androidx.constraintlayout.widget.ConstraintLayout
78
import androidx.fragment.app.FragmentTransaction
8-
import androidx.lifecycle.ViewModelProviders
99
import com.google.android.material.bottomnavigation.BottomNavigationView
1010

1111
class MainActivity : AppCompatActivity() {
1212

13-
private lateinit var signInVM : SignInViewModel
14-
13+
private val signInVM : SignInViewModel by viewModels()
1514

1615
private fun setupNavigationBar() {
1716
supportFragmentManager
@@ -59,10 +58,8 @@ class MainActivity : AppCompatActivity() {
5958
override fun onCreate(savedInstanceState: Bundle?) {
6059
super.onCreate(savedInstanceState)
6160
setContentView(R.layout.activity_main)
62-
63-
signInVM = ViewModelProviders.of(this)[SignInViewModel::class.java]
64-
signInVM.signInInit(this, this)
65-
61+
Log.d(MAIN_ACTIVITY_TAG, "onCreate")
62+
signInVM.signInVMInit(this, this)
6663
setupNavigationBar()
6764
}
6865

@@ -76,8 +73,8 @@ class MainActivity : AppCompatActivity() {
7673

7774
false -> {
7875
Log.d(MAIN_ACTIVITY_TAG, "No login. Update UI")
76+
// signInVM.signInAccountInit()
7977
findViewById<ConstraintLayout>(R.id.main_activity_view).removeAllViews()
80-
8178
supportFragmentManager
8279
.beginTransaction()
8380
.replace(R.id.main_activity_view, LoginFragment())
@@ -87,7 +84,6 @@ class MainActivity : AppCompatActivity() {
8784
}
8885
}
8986

90-
9187
companion object {
9288
const val MAIN_ACTIVITY_TAG = "MainActivity"
9389
}

android/canonical/app/src/main/java/com/google/samples/quickstart/canonical/MapsFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ class MapsFragment : Fragment() {
119119
setPlacesSearchBias()
120120
} ?: run{
121121
Log.d(FRAGMENT_TAG, "Locating Failed")
122-
Toast.makeText(context, getString(R.string.cannot_access_location), Toast.LENGTH_LONG)
122+
Toast.makeText(this.context, getString(R.string.cannot_access_location), Toast.LENGTH_LONG).show()
123123
}
124124
}
125125
}

android/canonical/app/src/main/java/com/google/samples/quickstart/canonical/MeFragment.kt

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,34 @@ import android.view.ViewGroup
1010
import android.widget.Button
1111
import android.widget.TextView
1212
import androidx.fragment.app.activityViewModels
13+
import androidx.lifecycle.Observer
1314

14-
private const val ARG_PARAM1 = "param1"
15-
private const val ARG_PARAM2 = "param2"
1615

17-
/**
18-
* A simple [Fragment] subclass.
19-
* Use the [MeFragment.newInstance] factory method to
20-
* create an instance of this fragment.
21-
*/
2216
class MeFragment : Fragment() {
2317

2418
private val signInVM: SignInViewModel by activityViewModels()
19+
private lateinit var observer : Observer<Boolean>
20+
21+
override fun onCreate(savedInstanceState: Bundle?) {
22+
super.onCreate(savedInstanceState)
23+
// Add login status change listener
24+
observer = Observer {
25+
when (it) {
26+
true -> {
27+
Log.d(ME_TAG, "firebaseUser is not null")
28+
}
29+
30+
false -> {
31+
Log.d(ME_TAG, "firebaseUser is null")
32+
val intent = Intent(context, MainActivity::class.java)
33+
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
34+
startActivity(intent)
35+
}
36+
}
37+
}
38+
// set LifeCycle owner with MeFragment. Observe will be destroyed when MeFragment is destroyed
39+
signInVM.getFirebaseAuthLogStatusLiveData().observe(this, observer)
40+
}
2541

2642
override fun onCreateView(
2743
inflater: LayoutInflater, container: ViewGroup?,
@@ -31,43 +47,18 @@ class MeFragment : Fragment() {
3147
return inflater.inflate(R.layout.fragment_me, container, false)
3248
}
3349

34-
3550
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
3651
super.onViewCreated(view, savedInstanceState)
3752
val logoutButton : Button = view.findViewById(R.id.logout_button)
3853
logoutButton.setOnClickListener {
3954
// Sign out both Google account and Firebase
40-
signInVM.signOut()?.addOnCompleteListener {
41-
val intent = Intent(context, MainActivity::class.java)
42-
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
43-
startActivity(intent)
44-
}
55+
signInVM.signOut()
4556
}
4657
// update UI
4758
view.findViewById<TextView>(R.id.textView)?.text = signInVM.getFirebaseAuthCurUser()?.email
4859
}
4960

50-
5161
companion object {
52-
/**
53-
* Use this factory method to create a new instance of
54-
* this fragment using the provided parameters.
55-
*
56-
* @param param1 Parameter 1.
57-
* @param param2 Parameter 2.
58-
* @return A new instance of fragment MeFragment.
59-
*/
60-
6162
private const val ME_TAG = "MeFragment"
62-
63-
// TODO: Rename and change types and number of parameters
64-
@JvmStatic
65-
fun newInstance(param1: String, param2: String) =
66-
MeFragment().apply {
67-
arguments = Bundle().apply {
68-
putString(ARG_PARAM1, param1)
69-
putString(ARG_PARAM2, param2)
70-
}
71-
}
7263
}
7364
}

0 commit comments

Comments
 (0)