diff --git a/Near/app/build.gradle.kts b/Near/app/build.gradle.kts index 50357e74..7165d602 100644 --- a/Near/app/build.gradle.kts +++ b/Near/app/build.gradle.kts @@ -4,6 +4,7 @@ plugins { alias(libs.plugins.kotlin.compose) alias(libs.plugins.hilt.application) alias(libs.plugins.kotlin.kapt) + alias(libs.plugins.kotlin.serialization) } android { @@ -73,4 +74,8 @@ dependencies { implementation(libs.room.ktx) kapt(libs.room.compiler) implementation(libs.room.paging) + // Navigation + implementation(libs.navigation.compose) + // Serialization + implementation(libs.kotlin.serialization.json) } diff --git a/Near/app/src/main/AndroidManifest.xml b/Near/app/src/main/AndroidManifest.xml index 1101a1e5..1a2cc18e 100644 --- a/Near/app/src/main/AndroidManifest.xml +++ b/Near/app/src/main/AndroidManifest.xml @@ -14,7 +14,7 @@ android:theme="@style/Theme.Near" tools:targetApi="31"> @@ -26,4 +26,4 @@ - \ No newline at end of file + diff --git a/Near/app/src/main/java/com/alarmy/near/MainActivity.kt b/Near/app/src/main/java/com/alarmy/near/MainActivity.kt deleted file mode 100644 index 738551df..00000000 --- a/Near/app/src/main/java/com/alarmy/near/MainActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.alarmy.near - -import android.os.Bundle -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.activity.enableEdgeToEdge -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.Preview -import com.alarmy.near.ui.theme.NearTheme - -class MainActivity : ComponentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - enableEdgeToEdge() - setContent { - NearTheme { - Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding -> - Greeting( - name = "Android", - modifier = Modifier.padding(innerPadding), - ) - } - } - } - } -} - -@Composable -fun Greeting( - name: String, - modifier: Modifier = Modifier, -) { - Text( - text = "Hello $name!", - modifier = modifier, - ) -} - -@Preview(showBackground = true) -@Composable -fun GreetingPreview() { - NearTheme { - Greeting("Android") - } -} diff --git a/Near/app/src/main/java/com/alarmy/near/data/di/RepositoryModule.kt b/Near/app/src/main/java/com/alarmy/near/data/di/RepositoryModule.kt new file mode 100644 index 00000000..f63b55df --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/data/di/RepositoryModule.kt @@ -0,0 +1,17 @@ +package com.alarmy.near.data.di + +import com.alarmy.near.data.repository.ExampleRepository +import com.alarmy.near.data.repository.ExampleRepositoryImpl +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +interface RepositoryModule { + @Binds + @Singleton + abstract fun bindExampleRepository(exampleRepositoryImpl: ExampleRepositoryImpl): ExampleRepository +} diff --git a/Near/app/src/main/java/com/alarmy/near/data/mapper/ExampleMapper.kt b/Near/app/src/main/java/com/alarmy/near/data/mapper/ExampleMapper.kt new file mode 100644 index 00000000..67093aaf --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/data/mapper/ExampleMapper.kt @@ -0,0 +1,9 @@ +package com.alarmy.near.data.mapper + +import com.alarmy.near.model.Example +import com.alarmy.near.network.response.ExampleEntity + +fun ExampleEntity.toModel(): Example = + Example( + id = id.toString(), + ) diff --git a/Near/app/src/main/java/com/alarmy/near/data/repository/ExampleRepository.kt b/Near/app/src/main/java/com/alarmy/near/data/repository/ExampleRepository.kt new file mode 100644 index 00000000..631d9a57 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/data/repository/ExampleRepository.kt @@ -0,0 +1,10 @@ +package com.alarmy.near.data.repository + +import com.alarmy.near.model.Example +import kotlinx.coroutines.flow.Flow + +interface ExampleRepository { + fun getExampleData(): String + + fun getData(): Flow +} diff --git a/Near/app/src/main/java/com/alarmy/near/data/repository/ExampleRepositoryImpl.kt b/Near/app/src/main/java/com/alarmy/near/data/repository/ExampleRepositoryImpl.kt new file mode 100644 index 00000000..f98375eb --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/data/repository/ExampleRepositoryImpl.kt @@ -0,0 +1,18 @@ +package com.alarmy.near.data.repository + +import com.alarmy.near.model.Example +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import javax.inject.Inject + +class ExampleRepositoryImpl + @Inject + constructor() : ExampleRepository { + override fun getExampleData(): String = "Hello from Repository" + + override fun getData(): Flow = + flow { + // val result = exampleService.fetchExample() + // emit(result.data.toModel()) + } + } diff --git a/Near/app/src/main/java/com/alarmy/near/model/.gitkeep b/Near/app/src/main/java/com/alarmy/near/model/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Near/app/src/main/java/com/alarmy/near/model/Example.kt b/Near/app/src/main/java/com/alarmy/near/model/Example.kt new file mode 100644 index 00000000..c6c1dd7c --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/model/Example.kt @@ -0,0 +1,5 @@ +package com.alarmy.near.model + +data class Example( + val id: String, +) diff --git a/Near/app/src/main/java/com/alarmy/near/di/AppModule.kt b/Near/app/src/main/java/com/alarmy/near/network/di/AppModule.kt similarity index 96% rename from Near/app/src/main/java/com/alarmy/near/di/AppModule.kt rename to Near/app/src/main/java/com/alarmy/near/network/di/AppModule.kt index 464b8cda..369900cc 100644 --- a/Near/app/src/main/java/com/alarmy/near/di/AppModule.kt +++ b/Near/app/src/main/java/com/alarmy/near/network/di/AppModule.kt @@ -1,4 +1,4 @@ -package com.alarmy.near.di +package com.alarmy.near.network.di // @Module // @InstallIn(SingletonComponent::class) diff --git a/Near/app/src/main/java/com/alarmy/near/network/response/ExampleEntity.kt b/Near/app/src/main/java/com/alarmy/near/network/response/ExampleEntity.kt new file mode 100644 index 00000000..b2c04583 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/network/response/ExampleEntity.kt @@ -0,0 +1,5 @@ +package com.alarmy.near.network.response + +data class ExampleEntity( + val id: Long, +) diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/HomeScreen.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/HomeScreen.kt new file mode 100644 index 00000000..fd8eebb9 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/HomeScreen.kt @@ -0,0 +1,51 @@ +package com.alarmy.near.presentation.feature.home + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.alarmy.near.presentation.feature.home.model.HomeUiState +import com.alarmy.near.presentation.ui.theme.NearTheme + +@Composable +internal fun HomeRoute( + viewModel: HomeViewModel = hiltViewModel(), + onShowErrorSnackBar: (throwable: Throwable?) -> Unit, +) { + val uiState = viewModel.uiStateFlow.collectAsStateWithLifecycle() + HomeScreen( + uiState = uiState.value, + onContactClick = {}, + onRemoveContact = viewModel::removeContact, + ) +} + +@Composable +internal fun HomeScreen( + modifier: Modifier = Modifier, + uiState: HomeUiState, + onContactClick: (Long) -> Unit = { _ -> }, + onRemoveContact: (Long) -> Unit = { _ -> }, +) { + Column(modifier = Modifier.fillMaxSize().background(Color.White)) { + Text("홈 화면") + } +} + +@Preview +@Composable +internal fun HomeScreenPreview() { + NearTheme { + HomeScreen( + uiState = HomeUiState.Loading, + onContactClick = {}, + onRemoveContact = {}, + ) + } +} diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/HomeViewModel.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/HomeViewModel.kt new file mode 100644 index 00000000..6a0b0496 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/HomeViewModel.kt @@ -0,0 +1,54 @@ +package com.alarmy.near.presentation.feature.home + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.alarmy.near.data.repository.ExampleRepository +import com.alarmy.near.presentation.feature.home.model.HomeUiState +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.flow.stateIn +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class HomeViewModel + @Inject + constructor( + private val exampleRepository: ExampleRepository, + ) : ViewModel() { + // Example: 여러번 초기화되는 StateFlow + private val _uiStateFlow = MutableStateFlow(HomeUiState.Loading) + val uiStateFlow = _uiStateFlow.asStateFlow() + + // Example: 한 번만 초기화되는 StateFlow + private val exampleStateFlow = + exampleRepository + .getData() + .map { + // Mapping to UIState + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5_000), + initialValue = HomeUiState.Loading, + ) + + fun fetchContacts() { + viewModelScope.launch { + exampleRepository + .getData() + .catch { + // handle error + }.collect { + // updateUI + } + } + } + + fun removeContact(id: Long) { + // contactRepository.removeContact(id) + } + } diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/model/HomeUiState.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/model/HomeUiState.kt new file mode 100644 index 00000000..c4510aef --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/model/HomeUiState.kt @@ -0,0 +1,9 @@ +package com.alarmy.near.presentation.feature.home.model + +sealed interface HomeUiState { + data object Loading : HomeUiState + + data class Success( + val data: Any, + ) : HomeUiState +} diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/navigation/HomeNavigation.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/navigation/HomeNavigation.kt new file mode 100644 index 00000000..748b9ab4 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/home/navigation/HomeNavigation.kt @@ -0,0 +1,29 @@ +package com.alarmy.near.presentation.feature.home.navigation + +import androidx.navigation.NavController +import androidx.navigation.NavGraphBuilder +import androidx.navigation.NavOptions +import androidx.navigation.compose.composable +import com.alarmy.near.presentation.feature.home.HomeRoute +import kotlinx.serialization.Serializable + +@Serializable +object RouteHome + +/* +* 추후 홈으로 화면 이동이 필요할 때 이 함수를 사용합니다. +* */ +fun NavController.navigateToHome(navOptions: NavOptions) { + navigate(RouteHome, navOptions) +} + +fun NavGraphBuilder.homeNavGraph( + onShowErrorSnackBar: (throwable: Throwable?) -> Unit, + onClickContact: (id: Long) -> Unit, +) { + composable { backStackEntry -> + HomeRoute( + onShowErrorSnackBar = onShowErrorSnackBar, + ) + } +} diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/main/MainActivity.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/main/MainActivity.kt new file mode 100644 index 00000000..35f00fdc --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/main/MainActivity.kt @@ -0,0 +1,21 @@ +package com.alarmy.near.presentation.feature.main + +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge +import com.alarmy.near.presentation.ui.theme.NearTheme +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + enableEdgeToEdge() + setContent { + NearTheme { + NearApp() + } + } + } +} diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/main/NearApp.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/main/NearApp.kt new file mode 100644 index 00000000..4730b2ac --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/main/NearApp.kt @@ -0,0 +1,57 @@ +package com.alarmy.near.presentation.feature.main + +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.exclude +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.safeDrawing +import androidx.compose.foundation.layout.windowInsetsPadding +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarDuration +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.navigation.NavHostController +import androidx.navigation.compose.rememberNavController +import kotlinx.coroutines.launch + +@Composable +internal fun NearApp( + modifier: Modifier = Modifier, + navController: NavHostController = rememberNavController(), +) { + val snackBarState = remember { SnackbarHostState() } + val scope = rememberCoroutineScope() + + Scaffold( + modifier = Modifier.fillMaxSize(), + snackbarHost = { + SnackbarHost( + hostState = snackBarState, + modifier = + Modifier.windowInsetsPadding( + WindowInsets.safeDrawing.exclude( + WindowInsets.ime, + ), + ), + ) + }, + ) { innerPadding -> + NearNavHost( + modifier = Modifier.padding(innerPadding), + navController = navController, + onShowSnackbar = { + scope.launch { + snackBarState.showSnackbar( + message = it?.message ?: return@launch, + duration = SnackbarDuration.Short, + ) + } + }, + ) + } +} diff --git a/Near/app/src/main/java/com/alarmy/near/presentation/feature/main/NearNavHost.kt b/Near/app/src/main/java/com/alarmy/near/presentation/feature/main/NearNavHost.kt new file mode 100644 index 00000000..ee75ae08 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/presentation/feature/main/NearNavHost.kt @@ -0,0 +1,28 @@ +package com.alarmy.near.presentation.feature.main + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.navigation.NavHostController +import androidx.navigation.compose.NavHost +import com.alarmy.near.presentation.feature.home.navigation.RouteHome +import com.alarmy.near.presentation.feature.home.navigation.homeNavGraph + +@Composable +internal fun NearNavHost( + modifier: Modifier = Modifier, + navController: NavHostController, + onShowSnackbar: (Throwable?) -> Unit = { _ -> }, +) { + /* + * 화면 이동 및 구성을 위한 컴포저블 함수입니다. + * */ + NavHost( + modifier = modifier, + navController = navController, + startDestination = RouteHome, + ) { + homeNavGraph(onShowErrorSnackBar = onShowSnackbar, onClickContact = { + // 예시: navController.navigate(RouteContact(it)) + }) + } +} diff --git a/Near/app/src/main/java/com/alarmy/near/ui/theme/Color.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/theme/Color.kt similarity index 73% rename from Near/app/src/main/java/com/alarmy/near/ui/theme/Color.kt rename to Near/app/src/main/java/com/alarmy/near/presentation/ui/theme/Color.kt index 869c5ab5..f20e42a3 100644 --- a/Near/app/src/main/java/com/alarmy/near/ui/theme/Color.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/theme/Color.kt @@ -1,4 +1,4 @@ -package com.alarmy.near.ui.theme +package com.alarmy.near.presentation.ui.theme import androidx.compose.ui.graphics.Color @@ -8,4 +8,4 @@ val Pink80 = Color(0xFFEFB8C8) val Purple40 = Color(0xFF6650a4) val PurpleGrey40 = Color(0xFF625b71) -val Pink40 = Color(0xFF7D5260) \ No newline at end of file +val Pink40 = Color(0xFF7D5260) diff --git a/Near/app/src/main/java/com/alarmy/near/ui/theme/Theme.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/theme/Theme.kt similarity index 55% rename from Near/app/src/main/java/com/alarmy/near/ui/theme/Theme.kt rename to Near/app/src/main/java/com/alarmy/near/presentation/ui/theme/Theme.kt index 7ed827c7..f99afa1d 100644 --- a/Near/app/src/main/java/com/alarmy/near/ui/theme/Theme.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/theme/Theme.kt @@ -1,6 +1,5 @@ -package com.alarmy.near.ui.theme +package com.alarmy.near.presentation.ui.theme -import android.app.Activity import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.MaterialTheme @@ -11,17 +10,18 @@ import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext -private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 -) - -private val LightColorScheme = lightColorScheme( - primary = Purple40, - secondary = PurpleGrey40, - tertiary = Pink40 +private val DarkColorScheme = + darkColorScheme( + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80, + ) +private val LightColorScheme = + lightColorScheme( + primary = Purple40, + secondary = PurpleGrey40, + tertiary = Pink40, /* Other default colors to override background = Color(0xFFFFFBFE), surface = Color(0xFFFFFBFE), @@ -30,29 +30,30 @@ private val LightColorScheme = lightColorScheme( onTertiary = Color.White, onBackground = Color(0xFF1C1B1F), onSurface = Color(0xFF1C1B1F), - */ -) + */ + ) @Composable fun NearTheme( darkTheme: Boolean = isSystemInDarkTheme(), // Dynamic color is available on Android 12+ dynamicColor: Boolean = true, - content: @Composable () -> Unit + content: @Composable () -> Unit, ) { - val colorScheme = when { - dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { - val context = LocalContext.current - if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) - } + val colorScheme = + when { + dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { + val context = LocalContext.current + if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context) + } - darkTheme -> DarkColorScheme - else -> LightColorScheme - } + darkTheme -> DarkColorScheme + else -> LightColorScheme + } MaterialTheme( colorScheme = colorScheme, typography = Typography, - content = content + content = content, ) -} \ No newline at end of file +} diff --git a/Near/app/src/main/java/com/alarmy/near/ui/theme/Type.kt b/Near/app/src/main/java/com/alarmy/near/presentation/ui/theme/Type.kt similarity index 67% rename from Near/app/src/main/java/com/alarmy/near/ui/theme/Type.kt rename to Near/app/src/main/java/com/alarmy/near/presentation/ui/theme/Type.kt index fdc85618..10ec1df7 100644 --- a/Near/app/src/main/java/com/alarmy/near/ui/theme/Type.kt +++ b/Near/app/src/main/java/com/alarmy/near/presentation/ui/theme/Type.kt @@ -1,4 +1,4 @@ -package com.alarmy.near.ui.theme +package com.alarmy.near.presentation.ui.theme import androidx.compose.material3.Typography import androidx.compose.ui.text.TextStyle @@ -7,14 +7,16 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.sp // Set of Material typography styles to start with -val Typography = Typography( - bodyLarge = TextStyle( - fontFamily = FontFamily.Default, - fontWeight = FontWeight.Normal, - fontSize = 16.sp, - lineHeight = 24.sp, - letterSpacing = 0.5.sp - ) +val Typography = + Typography( + bodyLarge = + TextStyle( + fontFamily = FontFamily.Default, + fontWeight = FontWeight.Normal, + fontSize = 16.sp, + lineHeight = 24.sp, + letterSpacing = 0.5.sp, + ), /* Other default text styles to override titleLarge = TextStyle( fontFamily = FontFamily.Default, @@ -30,5 +32,5 @@ val Typography = Typography( lineHeight = 16.sp, letterSpacing = 0.5.sp ) - */ -) \ No newline at end of file + */ + ) diff --git a/Near/app/src/main/java/com/alarmy/near/repository/ExampleRepository.kt b/Near/app/src/main/java/com/alarmy/near/repository/ExampleRepository.kt deleted file mode 100644 index d6ea4d99..00000000 --- a/Near/app/src/main/java/com/alarmy/near/repository/ExampleRepository.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.alarmy.near.repository - -interface ExampleRepository { - fun getExampleData(): String -} diff --git a/Near/app/src/main/java/com/alarmy/near/repository/ExampleRepositoryImpl.kt b/Near/app/src/main/java/com/alarmy/near/repository/ExampleRepositoryImpl.kt deleted file mode 100644 index 4709a51f..00000000 --- a/Near/app/src/main/java/com/alarmy/near/repository/ExampleRepositoryImpl.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.alarmy.near.repository - -class ExampleRepositoryImpl : ExampleRepository { - override fun getExampleData(): String = "Hello from Repository" -} diff --git a/Near/gradle/libs.versions.toml b/Near/gradle/libs.versions.toml index b5aa516e..b0336eb5 100644 --- a/Near/gradle/libs.versions.toml +++ b/Near/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] agp = "8.10.1" -kotlin = "2.0.21" +kotlin = "2.2.0" coreKtx = "1.16.0" junit = "4.13.2" junitVersion = "1.2.1" @@ -9,7 +9,7 @@ lifecycleRuntimeKtx = "2.9.1" activityCompose = "1.10.1" composeBom = "2024.09.00" # Hilt -hiltVersion = "2.51.1" +hiltVersion = "2.57" hiltNavigationVersion = "1.2.0" # Retrofit retrofitVersion = "2.9.0" @@ -19,6 +19,10 @@ glideVersion = "4.16.0" roomVersion = "2.6.1" # Ktlint ktlintVersion = "13.0.0" +# Navigation +navigationVersion = "2.9.2" +# Kotlin Serialization +kotlinSerializationVersion = "1.9.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -46,6 +50,8 @@ room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = " room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "roomVersion" } room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "roomVersion" } room-paging = { group = "androidx.room", name = "room-paging", version.ref = "roomVersion" } +navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationVersion" } +kotlin-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinSerializationVersion" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } @@ -54,4 +60,5 @@ kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "ko hilt-application = { id = "com.google.dagger.hilt.android", version.ref = "hiltVersion" } kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlintVersion" } +kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }