Skip to content

Commit 82bcb03

Browse files
committed
🐛 :: Fix Conflict
:: Fix Conflict
2 parents b8b1092 + e228c08 commit 82bcb03

File tree

84 files changed

+1228
-244
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+1228
-244
lines changed

app/build.gradle.kts

+2
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,7 @@ dependencies {
2727
implementation(project(":feature:score-mission"))
2828
implementation(project(":feature:shop"))
2929
implementation(libs.junit)
30+
implementation(libs.google.services)
31+
implementation(libs.play.services.auth)
3032
androidTestImplementation(libs.androidx.test.ext)
3133
}

app/google-services.json

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"project_info": {
3+
"project_number": "322299804217",
4+
"project_id": "stack-knowledge-v2",
5+
"storage_bucket": "stack-knowledge-v2.appspot.com"
6+
},
7+
"client": [
8+
{
9+
"client_info": {
10+
"mobilesdk_app_id": "1:322299804217:android:e15d7c6ad9b47cc65e2be8",
11+
"android_client_info": {
12+
"package_name": "com.kdn.stack_knowledge"
13+
}
14+
},
15+
"oauth_client": [],
16+
"api_key": [
17+
{
18+
"current_key": "AIzaSyBxMjD7Mg9vzfBiuZVBzyR12Ubr-uEZ_hQ"
19+
}
20+
],
21+
"services": {
22+
"appinvite_service": {
23+
"other_platform_oauth_client": []
24+
}
25+
}
26+
}
27+
],
28+
"configuration_version": "1"
29+
}

app/src/main/AndroidManifest.xml

+7-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<uses-permission android:name="android.permission.INTERNET" />
66

77
<application
8-
android:name="com.stackknowledge.StackKnowledgeApplication"
8+
android:name="com.kdn.stack_knowledge.StackKnowledgeApplication"
99
android:allowBackup="true"
1010
android:dataExtractionRules="@xml/data_extraction_rules"
1111
android:fullBackupContent="@xml/backup_rules"
@@ -15,17 +15,21 @@
1515
android:supportsRtl="true"
1616
android:theme="@style/Theme.StackKnowledge"
1717
tools:targetApi="31">
18+
1819
<activity
19-
android:name="com.stackknowledge.MainActivity"
20+
android:name="com.kdn.stack_knowledge.MainActivity"
2021
android:exported="true"
2122
android:label="@string/app_name"
2223
android:theme="@style/Theme.StackKnowledge">
2324
<intent-filter>
2425
<action android:name="android.intent.action.MAIN" />
2526

27+
<category android:name="android.intent.category.DEFAULT" />
28+
<category android:name="android.intent.category.BROWSABLE" />
2629
<category android:name="android.intent.category.LAUNCHER" />
2730
</intent-filter>
2831
</activity>
32+
2933
</application>
3034

31-
</manifest>
35+
</manifest>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
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+
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package com.stackknowledge
1+
package com.kdn.stack_knowledge
22

33
import android.app.Application
44
import dagger.hilt.android.HiltAndroidApp
55

66
@HiltAndroidApp
7-
class StackKnowledgeApplication : Application()
7+
class StackKnowledgeApplication : Application()

app/src/main/java/com/stackknowledge/navigation/StackKnowledgeNavHost.kt renamed to app/src/main/java/com/kdn/stack_knowledge/navigation/StackKnowledgeNavHost.kt

+10-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.stackknowledge.navigation
1+
package com.kdn.stack_knowledge.navigation
22

33
import androidx.compose.runtime.Composable
44
import androidx.compose.ui.Modifier
@@ -7,10 +7,9 @@ import com.stackknowledge.login.navigation.loginScreen
77
import com.stackknowledge.login.navigation.navigateToLogin
88
import com.stackknowledge.login.navigation.roleCheckRoute
99
import com.stackknowledge.login.navigation.roleCheckScreen
10-
import com.stackknowledge.main.navigation.mainPageRoute
1110
import com.stackknowledge.main.navigation.mainScreen
1211
import com.stackknowledge.main.navigation.navigateToMain
13-
import com.stackknowledge.navigation.util.bottomNavigationNavigate
12+
import com.kdn.stack_knowledge.navigation.util.bottomNavigationNavigate
1413
import com.stackknowledge.ranking.navigation.rankingScreen
1514
import com.stackknowledge.ranking.navigation.teacherRankingScreen
1615
import com.stackknowledge.score_mission.navigation.gradingAnswerScreen
@@ -20,19 +19,18 @@ import com.stackknowledge.shop.navigation.shopRoute
2019
import com.stackknowledge.shop.navigation.shopScreen
2120
import com.stackknowledge.shop.navigation.teacherShopRoute
2221
import com.stackknowledge.shop.navigation.teacherShopScreen
23-
import com.stackknowledge.ui.StackKnowledgeAppState
24-
import com.stackkowledge.mission.navigation.createMissionRoute
22+
import com.kdn.stack_knowledge.ui.StackKnowledgeAppState
2523
import com.stackkowledge.mission.navigation.createMissionScreen
26-
import com.stackkowledge.mission.navigation.entireMissionRoute
2724
import com.stackkowledge.mission.navigation.entireMissionScreen
2825
import com.stackkowledge.mission.navigation.navigateToResolveMission
2926
import com.stackkowledge.mission.navigation.resolveMissionScreen
3027

3128
@Composable
3229
fun StackKnowledgeNavHost(
3330
appState: StackKnowledgeAppState,
34-
modifier: Modifier = Modifier,
3531
startDestination: String = roleCheckRoute,
32+
modifier: Modifier = Modifier,
33+
onLoginButtonClick: () -> Unit = {},
3634
) {
3735
val navController = appState.navController
3836

@@ -41,9 +39,12 @@ fun StackKnowledgeNavHost(
4139
startDestination = startDestination,
4240
modifier = modifier
4341
) {
44-
loginScreen()
42+
loginScreen(
43+
onSuccess = navController::navigateToMain,
44+
onLoginButtonClick = onLoginButtonClick
45+
)
4546
roleCheckScreen(
46-
onRoleClick = navController::navigateToLogin
47+
onRoleButtonClick = navController::navigateToLogin
4748
)
4849
mainScreen(
4950
onNavigate = { role, navType -> bottomNavigationNavigate(role, navController, navType) }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.kdn.stack_knowledge.navigation
2+
3+
enum class TopLevelDestination {
4+
ROLE_CHECK,
5+
}

app/src/main/java/com/stackknowledge/navigation/util/BottomNavigationNavigate.kt renamed to app/src/main/java/com/kdn/stack_knowledge/navigation/util/BottomNavigationNavigate.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.stackknowledge.navigation.util
1+
package com.kdn.stack_knowledge.navigation.util
22

33
import androidx.navigation.NavController
44
import androidx.navigation.NavGraph.Companion.findStartDestination
@@ -12,7 +12,7 @@ import com.stackknowledge.shop.navigation.navigateToShop
1212
import com.stackknowledge.shop.navigation.navigateToTeacherShop
1313
import com.stackkowledge.mission.navigation.navigateToCreateMission
1414
import com.stackkowledge.mission.navigation.navigateToEntireMission
15-
import enumdatatype.Authority
15+
import enumdata.Authority
1616

1717
fun bottomNavigationNavigate(
1818
role: Authority,
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1-
package com.stackknowledge.ui
1+
package com.kdn.stack_knowledge.ui
22

33
import androidx.compose.material3.windowsizeclass.WindowSizeClass
44
import androidx.compose.runtime.Composable
55
import com.stackknowledge.design_system.theme.StackKnowledgeAndroidTheme
6-
import com.stackknowledge.navigation.StackKnowledgeNavHost
6+
import com.kdn.stack_knowledge.navigation.StackKnowledgeNavHost
77

88
@Composable
99
fun StackKnowledgeApp(
1010
windowSizeClass: WindowSizeClass,
1111
appState: StackKnowledgeAppState = rememberStackKnowledgeAppState(
1212
windowSizeClass = windowSizeClass
1313
),
14+
onLoginButtonClick: () -> Unit = {},
1415
) {
1516
StackKnowledgeAndroidTheme { _, _ ->
16-
StackKnowledgeNavHost(
17-
appState = appState,
18-
//startDestination = "" <- auth 작업후에 추가
19-
)
17+
StackKnowledgeNavHost(
18+
appState = appState,
19+
onLoginButtonClick = onLoginButtonClick
20+
)
2021
}
2122
}

app/src/main/java/com/stackknowledge/ui/StackKnowledgeAppState.kt renamed to app/src/main/java/com/kdn/stack_knowledge/ui/StackKnowledgeAppState.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
package com.stackknowledge.ui
1+
package com.kdn.stack_knowledge.ui
22

33
import androidx.compose.material3.windowsizeclass.WindowSizeClass
44
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
55
import androidx.compose.runtime.Composable
66
import androidx.compose.runtime.Stable
77
import androidx.compose.runtime.remember
88
import androidx.compose.runtime.rememberCoroutineScope
9-
import androidx.navigation.NavController
109
import androidx.navigation.NavDestination
1110
import androidx.navigation.NavHostController
1211
import androidx.navigation.compose.currentBackStackEntryAsState
1312
import androidx.navigation.compose.rememberNavController
14-
import com.stackknowledge.navigation.TopLevelDestination
13+
import com.kdn.stack_knowledge.navigation.TopLevelDestination
14+
import com.stackknowledge.login.navigation.roleCheckRoute
1515
import kotlinx.coroutines.CoroutineScope
1616

1717
@Composable
@@ -45,7 +45,7 @@ class StackKnowledgeAppState(
4545

4646
val currentTopLevelDestination: TopLevelDestination?
4747
@Composable get() = when(currentDestination?.route) {
48-
// loginRoute 작성
48+
roleCheckRoute -> TopLevelDestination.ROLE_CHECK
4949
else -> null
5050
}
5151

app/src/main/java/com/stackknowledge/MainActivity.kt

-47
This file was deleted.

0 commit comments

Comments
 (0)