1
+ package com.kdn.stack_knowledge
2
+
3
+ import android.os.Bundle
4
+ import android.util.Log
5
+ import android.widget.Toast
6
+ import androidx.activity.ComponentActivity
7
+ import androidx.activity.OnBackPressedCallback
8
+ import androidx.activity.compose.setContent
9
+ import androidx.activity.result.contract.ActivityResultContracts
10
+ import androidx.activity.viewModels
11
+ import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
12
+ import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
13
+ import androidx.compose.runtime.CompositionLocalProvider
14
+ import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner
15
+ import com.example.common.toast.makeToast
16
+ import com.google.android.gms.auth.api.signin.GoogleSignIn
17
+ import com.google.android.gms.auth.api.signin.GoogleSignInAccount
18
+ import com.google.android.gms.auth.api.signin.GoogleSignInClient
19
+ import com.google.android.gms.auth.api.signin.GoogleSignInOptions
20
+ import com.google.android.gms.common.api.ApiException
21
+ import com.google.android.gms.common.api.Scope
22
+ import com.google.android.gms.tasks.Task
23
+ import com.stackknowledge.design_system.theme.StackKnowledgeAndroidTheme
24
+ import com.stackknowledge.login.viewmodel.AuthViewModel
25
+ import com.kdn.stack_knowledge.ui.StackKnowledgeApp
26
+ import com.stackknowledge.user.R
27
+ import dagger.hilt.android.AndroidEntryPoint
28
+ import remote.request.auth.LoginRequestModel
29
+ import javax.inject.Inject
30
+ import javax.inject.Named
31
+
32
+ @AndroidEntryPoint
33
+ class MainActivity : ComponentActivity () {
34
+
35
+ @Inject
36
+ @Named(" GOOGLE_CLIENT_ID" )
37
+ lateinit var googleClientId: String
38
+
39
+ @Inject
40
+ @Named(" SCOPE" )
41
+ lateinit var scope: String
42
+
43
+ private val viewModel by viewModels<AuthViewModel >()
44
+
45
+ private val googleSignInClient: GoogleSignInClient by lazy { getGoogleClient() }
46
+
47
+ private val googleSignInLauncher =
48
+ registerForActivityResult(ActivityResultContracts .StartActivityForResult ()) { result ->
49
+ val task: Task <GoogleSignInAccount > =
50
+ GoogleSignIn .getSignedInAccountFromIntent(result.data)
51
+ handleGoogleSignInResult(task)
52
+ }
53
+
54
+ private var doubleBackToExitPressedOnce = false
55
+
56
+ private var backPressedTimestamp = 0L
57
+
58
+ private val onBackPressedCallback = object : OnBackPressedCallback (true ) {
59
+ override fun handleOnBackPressed () {
60
+ controlTheStackWhenBackPressed()
61
+ }
62
+ }
63
+
64
+ @OptIn(ExperimentalMaterial3WindowSizeClassApi ::class )
65
+ override fun onCreate (savedInstanceState : Bundle ? ) {
66
+ super .onCreate(savedInstanceState)
67
+ this .onBackPressedDispatcher.addCallback(this , onBackPressedCallback)
68
+ setContent {
69
+ CompositionLocalProvider (LocalViewModelStoreOwner provides this ) {
70
+ StackKnowledgeAndroidTheme { _, _ ->
71
+ StackKnowledgeApp (
72
+ windowSizeClass = calculateWindowSizeClass(this @MainActivity),
73
+ onLoginButtonClick = {
74
+ googleSocialLogin()
75
+ }
76
+ )
77
+ }
78
+ }
79
+ }
80
+ }
81
+
82
+ private fun controlTheStackWhenBackPressed () {
83
+ val currentTime = System .currentTimeMillis()
84
+ if (doubleBackToExitPressedOnce && currentTime - backPressedTimestamp <= 2000 ) {
85
+ finishAffinity()
86
+ } else {
87
+ doubleBackToExitPressedOnce = true
88
+ backPressedTimestamp = currentTime
89
+ makeToast(this , getString(R .string.close_app), Toast .LENGTH_SHORT )
90
+ }
91
+ }
92
+
93
+ private fun googleSocialLogin () {
94
+ googleSignInClient.signOut().addOnCompleteListener {
95
+ val signInIntent = googleSignInClient.signInIntent
96
+ googleSignInLauncher.launch(signInIntent)
97
+ }
98
+ }
99
+
100
+ private fun getGoogleClient (): GoogleSignInClient {
101
+ val googleSignInOptions = GoogleSignInOptions .Builder (GoogleSignInOptions .DEFAULT_SIGN_IN )
102
+ .requestScopes(Scope (scope))
103
+ .requestServerAuthCode(googleClientId)
104
+ .requestEmail()
105
+ .build()
106
+
107
+ return GoogleSignIn .getClient(this @MainActivity, googleSignInOptions)
108
+ }
109
+
110
+ private fun handleGoogleSignInResult (task : Task <GoogleSignInAccount >) {
111
+ val account = task.getResult(ApiException ::class .java)
112
+
113
+ with (viewModel) {
114
+ if (isStudent.value) {
115
+ loginStudent(body = LoginRequestModel (code = account.serverAuthCode.toString()))
116
+ } else {
117
+ loginTeacher(body = LoginRequestModel (code = account.serverAuthCode.toString()))
118
+ }
119
+ }
120
+ }
121
+ }
0 commit comments