Skip to content
16 changes: 16 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ plugins {
alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
id("com.google.dagger.hilt.android") // Hilt 플러그인 추가
kotlin("kapt") // Hilt를 위한 kapt 추가
}

android {
Expand Down Expand Up @@ -62,4 +64,18 @@ dependencies {

// Dots Indicator
implementation("com.tbuonomo:dotsindicator:5.1.0")

// Hilt
implementation(libs.hilt.android)
kapt(libs.hilt.compiler)
implementation(libs.androidx.hilt.navigation.compose)

// Retrofit
implementation(libs.retrofit)
implementation(libs.converter.gson)
}

// Hilt를 사용할 때 필요한 Annotation Processor
kapt {
correctErrorTypes = true
}
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools">

<application
android:name=".OurMenuApp"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/com/kuit/ourmenu/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ import androidx.navigation.compose.rememberNavController
import com.kuit.ourmenu.ui.navigator.MainNavGraph
import com.kuit.ourmenu.ui.onboarding.screen.SplashScreen
import com.kuit.ourmenu.ui.theme.OurMenuTheme
import dagger.hilt.android.AndroidEntryPoint

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down
7 changes: 7 additions & 0 deletions app/src/main/java/com/kuit/ourmenu/OurMenuApp.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.kuit.ourmenu

import android.app.Application
import dagger.hilt.android.HiltAndroidApp

@HiltAndroidApp
class OurMenuApp: Application()
7 changes: 7 additions & 0 deletions app/src/main/java/com/kuit/ourmenu/ui/dummy/data/DummyData.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.kuit.ourmenu.ui.dummy.data

data class DummyData(
val name: String = "",
val description: String = "",
val imageUrl: String = ""
)
13 changes: 13 additions & 0 deletions app/src/main/java/com/kuit/ourmenu/ui/dummy/data/DummyResponse.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.kuit.ourmenu.ui.dummy.data

data class DummyResponse(
val name: String = "",
val description: String = "",
val imageUrl: String = ""
)

fun DummyResponse.toDummyData() = DummyData(
name = name,
description = description,
imageUrl = imageUrl
)
27 changes: 27 additions & 0 deletions app/src/main/java/com/kuit/ourmenu/ui/dummy/di/NetworkModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.kuit.ourmenu.ui.dummy.di

import com.google.gson.Gson
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

// TODO : Interceptor , OkHttpClient

@Provides
@Singleton
fun providesRetrofit(
): Retrofit =
Retrofit.Builder()
.baseUrl("")
.addConverterFactory(GsonConverterFactory.create(Gson()))
.build()

}
17 changes: 17 additions & 0 deletions app/src/main/java/com/kuit/ourmenu/ui/dummy/di/RepositoryModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.kuit.ourmenu.ui.dummy.di

import com.kuit.ourmenu.ui.dummy.repository.DummyRepository
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
abstract class RepositoryModule {

@Binds
@Singleton
abstract fun bindDummyRepository(dummyRepository: DummyRepository): DummyRepository
}
19 changes: 19 additions & 0 deletions app/src/main/java/com/kuit/ourmenu/ui/dummy/di/ServiceModule.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.kuit.ourmenu.ui.dummy.di

import com.kuit.ourmenu.ui.dummy.service.DummyService
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import retrofit2.Retrofit
import javax.inject.Singleton

@Module
@InstallIn(SingletonComponent::class)
object ServiceModule {
@Provides
@Singleton
fun provideDummyService(retrofit: Retrofit): DummyService =
retrofit.create(DummyService::class.java)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.kuit.ourmenu.ui.dummy.repository

import android.util.Log
import com.kuit.ourmenu.ui.dummy.data.DummyData
import com.kuit.ourmenu.ui.dummy.data.toDummyData
import com.kuit.ourmenu.ui.dummy.service.DummyService
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOn
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class DummyRepository @Inject constructor(
private val dummyService: DummyService
) {
fun getDummyData(): Flow<DummyData> = flow {
try {
val response = dummyService.getDummyData()
emit(response.toDummyData())
} catch (e: Exception) {
Log.e("DummyRepository", "getDummyData: $e")
}
}.flowOn(Dispatchers.IO)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.kuit.ourmenu.ui.dummy.service

import com.kuit.ourmenu.ui.dummy.data.DummyResponse

interface DummyService {
// @GET("")
suspend fun getDummyData(): DummyResponse
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.kuit.ourmenu.ui.dummy.viewmodel

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.kuit.ourmenu.ui.dummy.data.DummyData
import com.kuit.ourmenu.ui.dummy.repository.DummyRepository
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.launch
import javax.inject.Inject

@HiltViewModel
class DummyViewModel @Inject constructor(
private val dummyRepository: DummyRepository
) : ViewModel() {

private val _dummyData: MutableStateFlow<DummyData> = MutableStateFlow(DummyData())
val dummyData: StateFlow<DummyData> = _dummyData.asStateFlow() // asStateFlow() 왜 달아야하는진 모름

init {
fetchDummyData()
}

private fun fetchDummyData() {
viewModelScope.launch {
dummyRepository.getDummyData()
.catch { e -> println("Error: $e") }
.collect { dummyData ->
_dummyData.value = dummyData
}
}
}

}
3 changes: 2 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.kotlin.compose) apply false
}
alias(libs.plugins.dagger.hilt) apply false
}
11 changes: 10 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
[versions]
agp = "8.7.3"
converterGson = "2.11.0"
hiltAndroid = "2.52"
hiltNavigationCompose = "1.2.0"
kotlin = "2.0.0"
coreKtx = "1.10.1"
junit = "4.13.2"
Expand All @@ -11,10 +14,15 @@ composeBom = "2024.04.01"
lifecycleViewmodel = "2.9.0-alpha08"
lifecycleViewmodelCompose = "2.9.0-alpha08"
lifecycleRuntimeComposeAndroid = "2.8.7"
retrofit = "2.11.0"
navigationCompose = "2.8.6"

[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hiltNavigationCompose" }
converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "converterGson" }
hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hiltAndroid" }
hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hiltAndroid" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
Expand All @@ -31,10 +39,11 @@ androidx-material3 = { group = "androidx.compose.material3", name = "material3"
androidx-lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel", version.ref = "lifecycleViewmodel" }
androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleViewmodelCompose" }
androidx-lifecycle-runtime-compose-android = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose-android", version.ref = "lifecycleRuntimeComposeAndroid" }
retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }

dagger-hilt = { id = "com.google.dagger.hilt.android", version.ref = "hiltAndroid" }