Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ dependencies {
implementation(project(":feature:home"))
implementation(project(":feature:create"))
implementation(project(":feature:profile"))
implementation(project(":feature:detail"))
implementation(project(":feature:friend"))
implementation(project(":core:designsystem"))
implementation(project(":core:data"))
implementation(project(":core:navigation"))
Expand Down
103 changes: 48 additions & 55 deletions app/src/main/java/com/idiotfrogs/memoryseal/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,22 @@ import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.imePadding
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation3.runtime.entryProvider
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.ui.NavDisplay
import com.idiotfrogs.auth.login.LoginRoute
import com.idiotfrogs.auth.signup.SignUpRoute
import com.idiotfrogs.create.CreateScreen
import com.idiotfrogs.designsystem.theme.MSTheme
import com.idiotfrogs.detail.DetailScreen
import com.idiotfrogs.friend.FriendScreen
import com.idiotfrogs.home.HomeScreen
import com.idiotfrogs.navigation.LocalComposeMSNavigator
import com.idiotfrogs.navigation.MSNavigatorImpl
import com.idiotfrogs.navigation.Routes
import com.idiotfrogs.profile.ProfileScreen
import dagger.hilt.android.AndroidEntryPoint
Expand All @@ -32,62 +38,49 @@ class MainActivity : ComponentActivity() {
enableEdgeToEdge()
setContent {
MSTheme {
val navController = rememberNavController()
val backStack = rememberNavBackStack(Routes.Login)
val navigator = remember(backStack) { MSNavigatorImpl(backStack) }

Scaffold(
modifier = Modifier
.fillMaxSize()
.imePadding()
) { _ ->
NavHost(
navController = navController,
startDestination = Routes.Login
) {
composable<Routes.Login> {
LoginRoute(
navigateToErrorScreen = {},
navigateToSignUpScreen = {
navController.navigate(Routes.SignUp)
CompositionLocalProvider(
LocalComposeMSNavigator provides navigator
) {
Scaffold(
modifier = Modifier
.fillMaxSize()
.imePadding()
) { _ ->
NavDisplay(
backStack = backStack,
entryProvider = entryProvider {
entry<Routes.Login> { LoginRoute() }
entry<Routes.SignUp> { SignUpRoute() }
entry<Routes.Home> { HomeScreen() }
entry<Routes.Create> { CreateScreen() }
entry<Routes.Profile> { ProfileScreen() }
entry<Routes.Detail> {
DetailScreen(
title = "ν…ŒμŠ€νŠΈ Title",
date = "2025-11-28",
isMember = true,
isVoteStart = true,
iSSeal = false,
onSealClicked = {},
onVoteClicked = {}
)
// TODO μΆ” ν›„ 데이터 ꡬ쑰 및 id κ°€μ Έκ°€μ„œ 정보 쑰회되게 μˆ˜μ • ν•„μš”
it.id
}
)
}
composable<Routes.SignUp> {
SignUpRoute(
navigateToBack = { navController.popBackStack() },
navigateToErrorScreen = {},
navigateToHomeScreen = {
navController.navigate(Routes.Home) {
popUpTo(navController.graph.startDestinationId) {
inclusive = true
}
}
entry<Routes.Message> {
// TODO λ©”μ‹œμ§€ ν™”λ©΄ 퍼블리싱 ν›„ μΆ”κ°€ν•˜κΈ°
it.id
}
)
}
composable<Routes.Home> {
HomeScreen(
navigateToCreate = { navController.navigate(Routes.Create) },
navigateToProfile = { navController.navigate(Routes.Profile) }
)
}
composable<Routes.Create> {
CreateScreen(
navigateToBack = { navController.popBackStack() }
)
}
composable<Routes.Profile> {
ProfileScreen(
navigateToBack = { navController.popBackStack() },
navigateToLogin = {
navController.navigate(Routes.Login) {
popUpTo<Routes.Home> {
inclusive = true
}
launchSingleTop = true
}
entry<Routes.Friend> {
FriendScreen()
// TODO μΆ” ν›„ id κ°€μ Έκ°€μ„œ 정보 쑰회되게 μˆ˜μ • ν•„μš”
it.id
}
)
}
},
)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions baselineProfile/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {

android {
namespace = "com.idiotfrogs.baselineprofile"
compileSdk = 35
compileSdk = 36

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
Expand All @@ -18,8 +18,8 @@ android {
}

defaultConfig {
minSdk = 28
targetSdk = 35
minSdk = 26
targetSdk = 36

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
testInstrumentationRunnerArguments["androidx.benchmark.suppressErrors"] = "EMULATOR"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ internal fun Project.configureComposeAndroid(commonExtension: CommonExtension<*,
add("implementation", libs.findLibrary("androidx-activity-compose").get())
add("implementation", libs.findLibrary("androidx-compose-material3").get())
add("implementation", libs.findLibrary("androidx-navigation").get())
add("implementation", libs.findLibrary("androidx-navigation3-runtime").get())
add("implementation", libs.findLibrary("androidx-navigation3-ui").get())

add("implementation", libs.findLibrary("landscapist-glide").get())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget

internal fun Project.configureKotlinAndroid(commonExtension: CommonExtension<*, *, *, *, *, *>) {
commonExtension.apply {
compileSdk = 35
compileSdk = 36

defaultConfig {
minSdk = 26
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,5 @@ dependencies {
"implementation"(project(":core:data"))
"implementation"(project(":core:domain"))
"implementation"(project(":core:util"))
implementation(project(":core:navigation"))
}
22 changes: 0 additions & 22 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,6 @@ plugins {
alias(libs.plugins.google.services) apply false
}

allprojects {
tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinCompile::class.java).configureEach {
kotlinOptions {
if (project.findProperty("enableMultiModuleComposeReports") == "true") {
freeCompilerArgs +=
listOf(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=" +
rootProject.buildDir.absolutePath + "/compose_metrics/",
)

freeCompilerArgs +=
listOf(
"-P",
"plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination=" +
rootProject.buildDir.absolutePath + "/compose_metrics/",
)
}
}
}
}

subprojects { // TODO μΆ” ν›„ libs.version.toml νŒŒμΌμ— μ ‘κ·Όν•˜μ—¬ plugin, version 정보 κ°€μ Έμ˜€κΈ°
apply(plugin = "io.gitlab.arturbosch.detekt")

Expand Down
3 changes: 3 additions & 0 deletions core/navigation/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ android {
dependencies {
implementation(libs.kotlinx.serialization.json)

implementation(libs.androidx.navigation3.runtime)
implementation(libs.androidx.navigation3.ui)

implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
testImplementation(libs.junit)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.idiotfrogs.navigation

import androidx.compose.runtime.ProvidableCompositionLocal
import androidx.compose.runtime.compositionLocalOf

val LocalComposeMSNavigator: ProvidableCompositionLocal<MSNavigator> =
compositionLocalOf { error("No MSNavigator provided!") }
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.idiotfrogs.navigation

import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey

interface MSNavigator {
fun navigate(routes: Routes)
fun popBackStack()
fun isLastRoutes(): Boolean
}

class MSNavigatorImpl(private val backStack: NavBackStack<NavKey>) : MSNavigator {
override fun navigate(routes: Routes) { backStack.add(routes) }
override fun popBackStack() { backStack.removeLastOrNull() }
override fun isLastRoutes(): Boolean {
return if (backStack.size > 1) {
backStack.removeLastOrNull() != null
} else {
false
}
}
}

Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package com.idiotfrogs.navigation

import androidx.navigation3.runtime.NavKey
import kotlinx.serialization.Serializable

sealed interface Routes {
sealed interface Routes: NavKey {
@Serializable
data object Login : Routes
@Serializable
Expand All @@ -13,4 +14,10 @@ sealed interface Routes {
data object Create : Routes
@Serializable
data object Profile : Routes
@Serializable
data class Friend(val id: Int) : Routes
@Serializable
data class Detail(val id: Int) : Routes
@Serializable
data class Message(val id: Int) : Routes
}
1 change: 0 additions & 1 deletion feature/auth/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ android {
}

dependencies {
implementation(libs.androidx.navigation)
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
testImplementation(libs.junit)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,22 @@ import com.idiotfrogs.auth.util.rememberLoginManager
import com.idiotfrogs.designsystem.component.MSText
import com.idiotfrogs.designsystem.theme.MSTheme
import com.idiotfrogs.designsystem.util.DevicePreview
import com.idiotfrogs.navigation.LocalComposeMSNavigator
import com.idiotfrogs.navigation.Routes
import com.idiotfrogs.resource.R
import com.idiotfrogs.resource.hsSantokki
import com.idiotfrogs.util.UiState

@Composable
fun LoginRoute(
loginViewModel: LoginViewModel = viewModel(),
navigateToErrorScreen: (String) -> Unit,
navigateToSignUpScreen: () -> Unit,
) {
val navigator = LocalComposeMSNavigator.current

LaunchedEffect(Unit) {
loginViewModel.event.collect { event ->
when (event) {
LoginEvent.NavigateToSignUp -> navigateToSignUpScreen()
LoginEvent.NavigateToSignUp -> navigator.navigate(Routes.SignUp)
}
}
}
Expand All @@ -54,13 +56,13 @@ fun LoginRoute(
UiState.Success -> {
LoginScreen(
googleLogin = {
loginViewModel.socialLogin { loginManager.googleLogin() } },
loginViewModel.socialLogin { loginManager?.googleLogin() } },
appleLogin = {
loginViewModel.socialLogin { loginManager.appleLogin() }
loginViewModel.socialLogin { loginManager?.appleLogin() }
}
)
}
is UiState.Error -> navigateToErrorScreen(state.errorMessage.toString())
is UiState.Error -> Unit
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,21 +43,22 @@ import com.idiotfrogs.designsystem.util.noRippleClickable
import com.idiotfrogs.designsystem.util.rememberKeyboardVisibility
import com.idiotfrogs.designsystem.util.rememberPickerState
import com.idiotfrogs.designsystem.util.toSp
import com.idiotfrogs.navigation.LocalComposeMSNavigator
import com.idiotfrogs.navigation.Routes
import com.idiotfrogs.resource.R
import com.idiotfrogs.util.UiState
import com.skydoves.landscapist.glide.GlideImage

@Composable
fun SignUpRoute(
signUpViewModel: SignUpViewModel = viewModel(),
navigateToBack: () -> Unit,
navigateToErrorScreen: (String) -> Unit,
navigateToHomeScreen: () -> Unit,
) {
val navigator = LocalComposeMSNavigator.current

LaunchedEffect(Unit) {
signUpViewModel.event.collect { event ->
when (event) {
SignUpEvent.NavigateToHome -> navigateToHomeScreen()
SignUpEvent.NavigateToHome -> navigator.navigate(Routes.Home)
}
}
}
Expand All @@ -68,11 +69,11 @@ fun SignUpRoute(
UiState.Init -> Unit // ν™”λ©΄ λ‘œλ”© 둜직
UiState.Success -> {
SignUpScreen(
navigateToBack = navigateToBack,
navigateToBack = { navigator.popBackStack() },
signUpViewModel::signUp,
)
}
is UiState.Error -> navigateToErrorScreen(state.errorMessage.toString())
is UiState.Error -> Unit
}
}

Expand Down
Loading