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

Commit 832118a

Browse files
authored
Merge pull request #476 from googlesamples/yang-auth
Yang auth
2 parents b60386d + f416fc5 commit 832118a

File tree

13 files changed

+435
-54
lines changed

13 files changed

+435
-54
lines changed

android/canonical/app/build.gradle

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ apply plugin: 'com.android.application'
22
apply plugin: 'kotlin-android'
33
apply plugin: 'kotlin-android-extensions'
44
apply plugin: 'kotlin-kapt'
5+
apply plugin: 'com.google.gms.google-services'
56

67
android {
78
compileSdkVersion 29
@@ -19,6 +20,7 @@ android {
1920
versionName "1.0"
2021

2122
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
23+
multiDexEnabled true
2224
}
2325

2426
buildTypes {
@@ -27,24 +29,36 @@ android {
2729
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
2830
}
2931
}
32+
33+
compileOptions {
34+
sourceCompatibility JavaVersion.VERSION_1_8
35+
targetCompatibility JavaVersion.VERSION_1_8
36+
}
37+
38+
kotlinOptions {
39+
jvmTarget = JavaVersion.VERSION_1_8.toString()
40+
}
3041
}
3142

3243
dependencies {
3344
implementation fileTree(dir: "libs", include: ["*.jar"])
3445
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
3546
implementation 'androidx.core:core-ktx:1.3.0'
3647
implementation 'androidx.appcompat:appcompat:1.1.0'
48+
implementation "androidx.fragment:fragment-ktx:1.2.5"
3749
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
38-
implementation 'com.google.android.gms:play-services-auth:18.0.0'
50+
implementation 'com.google.android.gms:play-services-auth:18.1.0'
3951
implementation 'com.google.android.material:material:1.1.0'
4052
implementation 'com.google.android.gms:play-services-maps:17.0.0'
4153
implementation 'com.google.android.gms:play-services-location:17.0.0'
4254
implementation 'com.google.android.libraries.places:places:2.3.0'
4355
implementation "android.arch.lifecycle:extensions:1.1.1"
4456
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'
57+
implementation 'com.google.firebase:firebase-analytics:17.4.4'
58+
implementation 'com.google.firebase:firebase-auth:19.3.2'
4559
kapt 'com.android.databinding:compiler:3.1.4'
4660
testImplementation 'junit:junit:4.12'
4761
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
4862
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
4963

50-
}
64+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"project_info": {
3+
"project_number": "558666181231",
4+
"firebase_url": "https://pivotal-nebula-281103.firebaseio.com",
5+
"project_id": "pivotal-nebula-281103",
6+
"storage_bucket": "pivotal-nebula-281103.appspot.com"
7+
},
8+
"client": [
9+
{
10+
"client_info": {
11+
"mobilesdk_app_id": "1:558666181231:android:ace62cb2b3bd45e4a3fb9a",
12+
"android_client_info": {
13+
"package_name": "com.google.samples.quickstart.canonical"
14+
}
15+
},
16+
"oauth_client": [
17+
{
18+
"client_id": "558666181231-ts5q1e04oha2g1m7km4jonff5s6fe1qk.apps.googleusercontent.com",
19+
"client_type": 1,
20+
"android_info": {
21+
"package_name": "com.google.samples.quickstart.canonical",
22+
"certificate_hash": "cf9e073a08e94150b32d4c6e5004a5e26a647287"
23+
}
24+
},
25+
{
26+
"client_id": "558666181231-bt85k6hb4mfeuri817m7o2n1m96a3shh.apps.googleusercontent.com",
27+
"client_type": 3
28+
}
29+
],
30+
"api_key": [
31+
{
32+
"current_key": "THIS IS PRIVATE"
33+
}
34+
],
35+
"services": {
36+
"appinvite_service": {
37+
"other_platform_oauth_client": [
38+
{
39+
"client_id": "558666181231-bt85k6hb4mfeuri817m7o2n1m96a3shh.apps.googleusercontent.com",
40+
"client_type": 3
41+
}
42+
]
43+
}
44+
}
45+
}
46+
],
47+
"configuration_version": "1"
48+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package com.google.samples.quickstart.canonical
2+
3+
import android.content.Intent
4+
import android.os.Bundle
5+
import android.util.Log
6+
import androidx.fragment.app.Fragment
7+
import android.view.LayoutInflater
8+
import android.view.View
9+
import android.view.ViewGroup
10+
import androidx.fragment.app.activityViewModels
11+
import androidx.lifecycle.Observer
12+
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
16+
17+
class LoginFragment : Fragment() {
18+
19+
private val signInVM: SignInViewModel by activityViewModels()
20+
21+
private fun signIn() {
22+
val signInIntent = signInVM.getSignInIntent()
23+
startActivityForResult(signInIntent, RC_SIGN_IN)
24+
}
25+
26+
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
27+
super.onActivityResult(requestCode, resultCode, data)
28+
29+
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
30+
if (requestCode == RC_SIGN_IN) {
31+
when (signInVM.firebaseAuth(data)) {
32+
FIREBASE_AUTH_WITH_GOOGLE_SUCCESSFUL -> {
33+
Log.i(LOGIN_FRAGMENT_TAG, "Google sign in successful")
34+
}
35+
36+
FIREBASE_AUTH_WITH_GOOGLE_FAIL -> {
37+
Log.w(LOGIN_FRAGMENT_TAG, "Google sign in failed")
38+
}
39+
40+
GOOGLE_SIGN_IN_UNSUCCESSFUL -> {
41+
Log.w(LOGIN_FRAGMENT_TAG, "Google sign in unsuccessful")
42+
}
43+
}
44+
}
45+
// No other requestCode, ignore it.
46+
}
47+
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+
67+
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
68+
savedInstanceState: Bundle?): View? {
69+
// Inflate the layout for this fragment
70+
return inflater.inflate(R.layout.fragment_login, container, false)
71+
}
72+
73+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
74+
super.onViewCreated(view, savedInstanceState)
75+
view.findViewById<SignInButton>(R.id.sign_in_button).setOnClickListener {
76+
signIn()
77+
}
78+
}
79+
80+
companion object {
81+
const val RC_SIGN_IN = 0
82+
const val LOGIN_FRAGMENT_TAG = "Login fragment"
83+
}
84+
}

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

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@ package com.google.samples.quickstart.canonical
22

33
import androidx.appcompat.app.AppCompatActivity
44
import android.os.Bundle
5+
import android.util.Log
6+
import androidx.activity.viewModels
7+
import androidx.constraintlayout.widget.ConstraintLayout
58
import androidx.fragment.app.FragmentTransaction
69
import com.google.android.material.bottomnavigation.BottomNavigationView
710

811
class MainActivity : AppCompatActivity() {
912

10-
override fun onCreate(savedInstanceState: Bundle?) {
11-
super.onCreate(savedInstanceState)
12-
setContentView(R.layout.activity_main)
13+
private val signInVM : SignInViewModel by viewModels()
1314

14-
val runFragment = RunFragment()
15+
private fun setupNavigationBar() {
1516
supportFragmentManager
1617
.beginTransaction()
17-
.replace(R.id.fragment_container, runFragment)
18+
.replace(R.id.fragment_container, RunFragment())
1819
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
1920
.commit()
2021

@@ -23,30 +24,27 @@ class MainActivity : AppCompatActivity() {
2324
when (item.itemId) {
2425

2526
R.id.bottom_navigation_item_run -> {
26-
val runFragment = RunFragment()
2727
supportFragmentManager
2828
.beginTransaction()
29-
.replace(R.id.fragment_container, runFragment)
29+
.replace(R.id.fragment_container, RunFragment())
3030
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
3131
.commit()
3232
true
3333
}
3434

3535
R.id.bottom_navigation_item_map -> {
36-
val mapsFragment = MapsFragment()
3736
supportFragmentManager
3837
.beginTransaction()
39-
.replace(R.id.fragment_container, mapsFragment)
38+
.replace(R.id.fragment_container, MapsFragment())
4039
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
4140
.commit()
4241
true
4342
}
4443

4544
R.id.bottom_navigation_item_profile -> {
46-
val meFragment = MeFragment()
4745
supportFragmentManager
4846
.beginTransaction()
49-
.replace(R.id.fragment_container, meFragment)
47+
.replace(R.id.fragment_container, MeFragment())
5048
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
5149
.commit()
5250
true
@@ -57,6 +55,37 @@ class MainActivity : AppCompatActivity() {
5755
}
5856
}
5957

58+
override fun onCreate(savedInstanceState: Bundle?) {
59+
super.onCreate(savedInstanceState)
60+
setContentView(R.layout.activity_main)
61+
Log.d(MAIN_ACTIVITY_TAG, "onCreate")
62+
signInVM.signInVMInit(this, this)
63+
setupNavigationBar()
64+
}
65+
66+
override fun onStart() {
67+
super.onStart()
6068

69+
when (signInVM.isLogIn()) {
70+
true -> {
71+
Log.d(MAIN_ACTIVITY_TAG, "Already login")
72+
}
73+
74+
false -> {
75+
Log.d(MAIN_ACTIVITY_TAG, "No login. Update UI")
76+
// signInVM.signInAccountInit()
77+
findViewById<ConstraintLayout>(R.id.main_activity_view).removeAllViews()
78+
supportFragmentManager
79+
.beginTransaction()
80+
.replace(R.id.main_activity_view, LoginFragment())
81+
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
82+
.commit()
83+
}
84+
}
85+
}
86+
87+
companion object {
88+
const val MAIN_ACTIVITY_TAG = "MainActivity"
89+
}
6190

6291
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class MapsFragment : Fragment() {
4444
private lateinit var autocompleteFragment : AutocompleteSupportFragment
4545
private var currentLatLng : LatLng? = null
4646
private var targetMarker : Marker? = null
47-
47+
4848
companion object {
4949
private const val LOCATION_PERMISSION_REQUEST_CODE = 1
5050
private const val ZOOM_VALUE = 14f
@@ -99,9 +99,10 @@ class MapsFragment : Fragment() {
9999
map.isMyLocationEnabled = true
100100
map.setPadding(0, (PADDING_RATIO * autocompleteLayout.height).toInt(),0,0)
101101

102-
fusedLocationClient.lastLocation.addOnSuccessListener(this.activity as Activity) { location ->
102+
fusedLocationClient.lastLocation.addOnSuccessListener { location ->
103103
// Got last known location. In some rare situations this can be null.
104104
location?.let {
105+
Log.d(FRAGMENT_TAG, "Locating Success ${location.latitude}, ${location.longitude}")
105106
lastLocation = location
106107
currentLatLng = LatLng(location.latitude, location.longitude)
107108
map.animateCamera(CameraUpdateFactory.newLatLngZoom(
@@ -117,7 +118,8 @@ class MapsFragment : Fragment() {
117118
))
118119
setPlacesSearchBias()
119120
} ?: run{
120-
Toast.makeText(context, getString(R.string.cannot_access_location), Toast.LENGTH_SHORT)
121+
Log.d(FRAGMENT_TAG, "Locating Failed")
122+
Toast.makeText(this.context, getString(R.string.cannot_access_location), Toast.LENGTH_LONG).show()
121123
}
122124
}
123125
}

0 commit comments

Comments
 (0)