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