From 9b3e75952eff6f865b19da97859f749aa659abe5 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Tue, 19 Aug 2025 20:20:53 +0900 Subject: [PATCH 01/13] =?UTF-8?q?feat:=20=EB=84=A4=ED=8A=B8=EC=9B=8C?= =?UTF-8?q?=ED=81=AC=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=9F=AC=EB=A6=AC=20?= =?UTF-8?q?=EB=B0=8F=20=EB=B9=8C=EB=93=9C=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Near/app/build.gradle.kts | 18 ++++++++++++++++-- Near/gradle/libs.versions.toml | 7 +++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/Near/app/build.gradle.kts b/Near/app/build.gradle.kts index f24511cd..ac3d9d3d 100644 --- a/Near/app/build.gradle.kts +++ b/Near/app/build.gradle.kts @@ -1,3 +1,9 @@ +import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties +import java.util.Properties + +val localProperties = + Properties().apply { rootProject.file("local.properties").inputStream().use { load(it) } } + plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) @@ -28,6 +34,10 @@ android { getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro", ) + buildConfigField("String", "NEAR_URL", getProperty("NEAR_PROD_URL")) + } + debug { + buildConfigField("String", "NEAR_URL", getProperty("NEAR_DEV_URL")) } } compileOptions { @@ -38,6 +48,7 @@ android { jvmTarget = "11" } buildFeatures { + buildConfig = true compose = true } } @@ -63,9 +74,10 @@ dependencies { implementation(libs.hilt.android) kapt(libs.hilt.android.compiler) implementation(libs.hilt.navigation.compose) - // Retrofit + // Retrofit & OkHttp implementation(libs.retrofit) - implementation(libs.retrofit.converter.gson) + implementation(libs.retrofit.kotlin.serialization.converter) + implementation(libs.logging.interceptor) // Glide implementation(libs.glide) kapt(libs.glide.compiler) @@ -79,3 +91,5 @@ dependencies { // Serialization implementation(libs.kotlin.serialization.json) } + +fun getProperty(propertyKey: String): String = gradleLocalProperties(rootDir, providers).getProperty(propertyKey) diff --git a/Near/gradle/libs.versions.toml b/Near/gradle/libs.versions.toml index b0336eb5..9c13f8fc 100644 --- a/Near/gradle/libs.versions.toml +++ b/Near/gradle/libs.versions.toml @@ -12,7 +12,7 @@ composeBom = "2024.09.00" hiltVersion = "2.57" hiltNavigationVersion = "1.2.0" # Retrofit -retrofitVersion = "2.9.0" +retrofitVersion = "3.0.0" # Glide glideVersion = "4.16.0" # Room @@ -23,6 +23,8 @@ ktlintVersion = "13.0.0" navigationVersion = "2.9.2" # Kotlin Serialization kotlinSerializationVersion = "1.9.0" +# OkHttp +okHttp = "5.1.0" [libraries] androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } @@ -43,7 +45,6 @@ hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref hilt-android-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hiltVersion" } hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltNavigationVersion" } retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofitVersion" } -retrofit-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofitVersion" } glide = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glideVersion" } glide-compiler = { group = "com.github.bumptech.glide", name = "compiler", version.ref = "glideVersion" } room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "roomVersion" } @@ -52,6 +53,8 @@ room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = 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" } +logging-interceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "okHttp" } +retrofit-kotlin-serialization-converter = { group = "com.squareup.retrofit2", name = "converter-kotlinx-serialization", version.ref = "retrofitVersion" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } From 78f229d0802d35e30793f9aa715c9333639e1feb Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Tue, 19 Aug 2025 20:34:12 +0900 Subject: [PATCH 02/13] =?UTF-8?q?feat:=20Retrofit=20&=20Okhttp=20DI=20?= =?UTF-8?q?=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarmy/near/network/di/NetworkModule.kt | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 Near/app/src/main/java/com/alarmy/near/network/di/NetworkModule.kt diff --git a/Near/app/src/main/java/com/alarmy/near/network/di/NetworkModule.kt b/Near/app/src/main/java/com/alarmy/near/network/di/NetworkModule.kt new file mode 100644 index 00000000..0a1285f0 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/network/di/NetworkModule.kt @@ -0,0 +1,54 @@ +package com.alarmy.near.network.di + +import com.alarmy.near.BuildConfig +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import kotlinx.serialization.json.Json +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.kotlinx.serialization.asConverterFactory +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +object NetworkModule { + private val json = + Json { + encodeDefaults = true + ignoreUnknownKeys = true + prettyPrint = true + isLenient = true + } + + private val jsonConverterFactory = json.asConverterFactory("application/json".toMediaType()) + + @Provides + @Singleton + fun provideOkHttpClient(loggingInterceptor: HttpLoggingInterceptor): OkHttpClient = + OkHttpClient.Builder().addInterceptor(loggingInterceptor).build() + + @Provides + @Singleton + fun provideLoggingInterceptor(): HttpLoggingInterceptor = + HttpLoggingInterceptor().let { + if (BuildConfig.DEBUG) { + it.setLevel(HttpLoggingInterceptor.Level.BODY) + } else { + it.setLevel(HttpLoggingInterceptor.Level.NONE) + } + } + + @Provides + @Singleton + fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit = + Retrofit + .Builder() + .baseUrl(BuildConfig.NEAR_URL) + .client(okHttpClient) + .addConverterFactory(jsonConverterFactory) + .build() +} From 04c82e2e43b867af2597cd9d09c744c6e1f1863d Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Tue, 19 Aug 2025 20:37:42 +0900 Subject: [PATCH 03/13] =?UTF-8?q?chore:=20=EA=B8=B0=EC=A1=B4=20AppModule?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/alarmy/near/network/di/AppModule.kt | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 Near/app/src/main/java/com/alarmy/near/network/di/AppModule.kt diff --git a/Near/app/src/main/java/com/alarmy/near/network/di/AppModule.kt b/Near/app/src/main/java/com/alarmy/near/network/di/AppModule.kt deleted file mode 100644 index 369900cc..00000000 --- a/Near/app/src/main/java/com/alarmy/near/network/di/AppModule.kt +++ /dev/null @@ -1,31 +0,0 @@ -package com.alarmy.near.network.di - -// @Module -// @InstallIn(SingletonComponent::class) -// object AppModule { -// @Provides -// @Singleton -// fun provideGson(): Gson = GsonBuilder().create() -// -// @Provides -// @Singleton -// fun provideRetrofit(gson: Gson): Retrofit = -// Retrofit.Builder() -// .baseUrl("https://api.example.com/") // TODO: 실제 baseUrl로 변경 -// .addConverterFactory(GsonConverterFactory.create(gson)) -// .build() -// -// @Provides -// @Singleton -// fun provideDatabase(app: Context): AppDatabase = -// Room.databaseBuilder(app, AppDatabase::class.java, "app_db").build() -// -// @Provides -// @Singleton -// fun provideGlideRequestManager(app: Context): RequestManager = -// Glide.with(app) -// -// @Provides -// @Singleton -// fun provideExampleRepository(): ExampleRepository = ExampleRepositoryImpl() -// } From 046affd4ea3d478b42455f72aaf1357a908bdd97 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Tue, 19 Aug 2025 20:37:55 +0900 Subject: [PATCH 04/13] =?UTF-8?q?feat:=20=ED=86=A0=ED=81=B0=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=8D=BC=ED=8B=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Near/app/build.gradle.kts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Near/app/build.gradle.kts b/Near/app/build.gradle.kts index ac3d9d3d..201141f8 100644 --- a/Near/app/build.gradle.kts +++ b/Near/app/build.gradle.kts @@ -1,8 +1,4 @@ import com.android.build.gradle.internal.cxx.configure.gradleLocalProperties -import java.util.Properties - -val localProperties = - Properties().apply { rootProject.file("local.properties").inputStream().use { load(it) } } plugins { alias(libs.plugins.android.application) @@ -38,6 +34,7 @@ android { } debug { buildConfigField("String", "NEAR_URL", getProperty("NEAR_DEV_URL")) + buildConfigField("String", "TEMP_TOKEN", getProperty("TEMP_TOKEN")) // TODO 추후 삭제 필요 } } compileOptions { From 28235134838596166460336c0ee870cee5e05ddd Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Tue, 19 Aug 2025 22:35:59 +0900 Subject: [PATCH 05/13] =?UTF-8?q?feat:=20=EC=9E=84=EC=8B=9C=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EC=9D=B8=ED=84=B0=EC=85=89=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../near/network/auth/TokenInterceptor.kt | 21 +++++++++++++++++++ .../alarmy/near/network/di/NetworkModule.kt | 12 +++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 Near/app/src/main/java/com/alarmy/near/network/auth/TokenInterceptor.kt diff --git a/Near/app/src/main/java/com/alarmy/near/network/auth/TokenInterceptor.kt b/Near/app/src/main/java/com/alarmy/near/network/auth/TokenInterceptor.kt new file mode 100644 index 00000000..e2e99566 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/network/auth/TokenInterceptor.kt @@ -0,0 +1,21 @@ +package com.alarmy.near.network.auth + +import com.alarmy.near.BuildConfig +import okhttp3.Interceptor +import okhttp3.Response +import javax.inject.Inject + +class TokenInterceptor + @Inject + constructor() : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + return chain.proceed( + request = + request + .newBuilder() + .addHeader("Authorization", "Bearer ${BuildConfig.TEMP_TOKEN}") + .build(), + ) + } + } diff --git a/Near/app/src/main/java/com/alarmy/near/network/di/NetworkModule.kt b/Near/app/src/main/java/com/alarmy/near/network/di/NetworkModule.kt index 0a1285f0..de4e1e8d 100644 --- a/Near/app/src/main/java/com/alarmy/near/network/di/NetworkModule.kt +++ b/Near/app/src/main/java/com/alarmy/near/network/di/NetworkModule.kt @@ -1,6 +1,7 @@ package com.alarmy.near.network.di import com.alarmy.near.BuildConfig +import com.alarmy.near.network.auth.TokenInterceptor import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -28,8 +29,15 @@ object NetworkModule { @Provides @Singleton - fun provideOkHttpClient(loggingInterceptor: HttpLoggingInterceptor): OkHttpClient = - OkHttpClient.Builder().addInterceptor(loggingInterceptor).build() + fun provideOkHttpClient( + loggingInterceptor: HttpLoggingInterceptor, + tokenInterceptor: TokenInterceptor, + ): OkHttpClient = + OkHttpClient + .Builder() + .addInterceptor(loggingInterceptor) + .addInterceptor(tokenInterceptor) + .build() @Provides @Singleton From c69b99bcd970ca1001c20bae1de53997cbe689ba Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Tue, 19 Aug 2025 23:31:17 +0900 Subject: [PATCH 06/13] =?UTF-8?q?feat:=20Service=20di=20=EB=AA=A8=EB=93=88?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/alarmy/near/network/di/ServiceModule.kt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Near/app/src/main/java/com/alarmy/near/network/di/ServiceModule.kt diff --git a/Near/app/src/main/java/com/alarmy/near/network/di/ServiceModule.kt b/Near/app/src/main/java/com/alarmy/near/network/di/ServiceModule.kt new file mode 100644 index 00000000..a6ef4802 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/network/di/ServiceModule.kt @@ -0,0 +1,17 @@ +package com.alarmy.near.network.di + +import com.alarmy.near.network.service.FriendService +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 provideFriendService(retrofit: Retrofit): FriendService = retrofit.create(FriendService::class.java) +} From 3da61e0676ed554663dbb312ead89d4a99c421b6 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Tue, 19 Aug 2025 23:31:46 +0900 Subject: [PATCH 07/13] =?UTF-8?q?feat:=20=ED=99=88=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EC=98=88=EC=8B=9C=20API=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alarmy/near/data/di/RepositoryModule.kt | 5 +++ .../alarmy/near/data/mapper/FriendMapper.kt | 16 +++++++++ .../repository/DefaultFriendRepository.kt | 23 +++++++++++++ .../near/data/repository/FriendRepository.kt | 8 +++++ .../main/java/com/alarmy/near/model/Friend.kt | 12 +++++++ .../near/network/response/FriendEntity.kt | 15 ++++++++ .../near/network/service/FriendService.kt | 9 +++++ .../feature/home/HomeViewModel.kt | 34 +++++-------------- 8 files changed, 97 insertions(+), 25 deletions(-) create mode 100644 Near/app/src/main/java/com/alarmy/near/data/mapper/FriendMapper.kt create mode 100644 Near/app/src/main/java/com/alarmy/near/data/repository/DefaultFriendRepository.kt create mode 100644 Near/app/src/main/java/com/alarmy/near/data/repository/FriendRepository.kt create mode 100644 Near/app/src/main/java/com/alarmy/near/model/Friend.kt create mode 100644 Near/app/src/main/java/com/alarmy/near/network/response/FriendEntity.kt create mode 100644 Near/app/src/main/java/com/alarmy/near/network/service/FriendService.kt 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 index f63b55df..df79caac 100644 --- 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 @@ -2,6 +2,7 @@ package com.alarmy.near.data.di import com.alarmy.near.data.repository.ExampleRepository import com.alarmy.near.data.repository.ExampleRepositoryImpl +import com.alarmy.near.data.repository.FriendRepository import dagger.Binds import dagger.Module import dagger.hilt.InstallIn @@ -14,4 +15,8 @@ interface RepositoryModule { @Binds @Singleton abstract fun bindExampleRepository(exampleRepositoryImpl: ExampleRepositoryImpl): ExampleRepository + + @Binds + @Singleton + abstract fun bindFriendRepository(friendRepository: FriendRepository): FriendRepository } diff --git a/Near/app/src/main/java/com/alarmy/near/data/mapper/FriendMapper.kt b/Near/app/src/main/java/com/alarmy/near/data/mapper/FriendMapper.kt new file mode 100644 index 00000000..4a2b19d9 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/data/mapper/FriendMapper.kt @@ -0,0 +1,16 @@ +package com.alarmy.near.data.mapper + +import com.alarmy.near.model.Friend +import com.alarmy.near.network.response.FriendEntity + +fun FriendEntity.toModel(): Friend = + Friend( + friendId = friendId, + position = position, + source = source, + name = name, + imageUrl = imageUrl, + fileName = fileName, + checkRate = checkRate, + lastContactAt = lastContactAt, + ) diff --git a/Near/app/src/main/java/com/alarmy/near/data/repository/DefaultFriendRepository.kt b/Near/app/src/main/java/com/alarmy/near/data/repository/DefaultFriendRepository.kt new file mode 100644 index 00000000..dd155182 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/data/repository/DefaultFriendRepository.kt @@ -0,0 +1,23 @@ +package com.alarmy.near.data.repository + +import com.alarmy.near.data.mapper.toModel +import com.alarmy.near.model.Friend +import com.alarmy.near.network.service.FriendService +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow +import javax.inject.Inject + +class DefaultFriendRepository + @Inject + constructor( + private val friendService: FriendService, + ) : FriendRepository { + override fun fetchFriends(): Flow> = + flow { + emit( + friendService.fetchFriends().map { + it.toModel() + }, + ) + } + } diff --git a/Near/app/src/main/java/com/alarmy/near/data/repository/FriendRepository.kt b/Near/app/src/main/java/com/alarmy/near/data/repository/FriendRepository.kt new file mode 100644 index 00000000..b7e76baa --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/data/repository/FriendRepository.kt @@ -0,0 +1,8 @@ +package com.alarmy.near.data.repository + +import com.alarmy.near.model.Friend +import kotlinx.coroutines.flow.Flow + +interface FriendRepository { + fun fetchFriends(): Flow> +} diff --git a/Near/app/src/main/java/com/alarmy/near/model/Friend.kt b/Near/app/src/main/java/com/alarmy/near/model/Friend.kt new file mode 100644 index 00000000..ebd71a9b --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/model/Friend.kt @@ -0,0 +1,12 @@ +package com.alarmy.near.model + +data class Friend( + val friendId: String, + val position: Int, + val source: String, + val name: String, + val imageUrl: String? = null, + val fileName: String? = null, + val checkRate: Int, + val lastContactAt: String? = null, +) diff --git a/Near/app/src/main/java/com/alarmy/near/network/response/FriendEntity.kt b/Near/app/src/main/java/com/alarmy/near/network/response/FriendEntity.kt new file mode 100644 index 00000000..7ec3ab3d --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/network/response/FriendEntity.kt @@ -0,0 +1,15 @@ +package com.alarmy.near.network.response + +import kotlinx.serialization.Serializable + +@Serializable +data class FriendEntity( + val friendId: String, + val position: Int, + val source: String, + val name: String, + val imageUrl: String? = null, + val fileName: String? = null, + val checkRate: Int, + val lastContactAt: String? = null, +) diff --git a/Near/app/src/main/java/com/alarmy/near/network/service/FriendService.kt b/Near/app/src/main/java/com/alarmy/near/network/service/FriendService.kt new file mode 100644 index 00000000..eb353a89 --- /dev/null +++ b/Near/app/src/main/java/com/alarmy/near/network/service/FriendService.kt @@ -0,0 +1,9 @@ +package com.alarmy.near.network.service + +import com.alarmy.near.network.response.FriendEntity +import retrofit2.http.GET + +interface FriendService { + @GET + suspend fun fetchFriends(): List +} 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 index 6a0b0496..aba76bc8 100644 --- 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 @@ -2,52 +2,36 @@ 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.data.repository.FriendRepository +import com.alarmy.near.model.Friend 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.StateFlow 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, + private val friendRepository: FriendRepository, ) : 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( + val friendsFlow: StateFlow> = + friendRepository + .fetchFriends() + .stateIn( scope = viewModelScope, started = SharingStarted.WhileSubscribed(5_000), - initialValue = HomeUiState.Loading, + initialValue = emptyList(), ) - fun fetchContacts() { - viewModelScope.launch { - exampleRepository - .getData() - .catch { - // handle error - }.collect { - // updateUI - } - } - } - fun removeContact(id: Long) { // contactRepository.removeContact(id) } From b7cace91b39ad4443441a5378f6a77b67c2e15eb Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 20 Aug 2025 23:50:03 +0900 Subject: [PATCH 08/13] =?UTF-8?q?feat:=20=EC=9D=B8=ED=84=B0=EB=84=B7=20?= =?UTF-8?q?=ED=8D=BC=EB=AF=B8=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Near/app/src/main/AndroidManifest.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Near/app/src/main/AndroidManifest.xml b/Near/app/src/main/AndroidManifest.xml index 1a2cc18e..08b99e2f 100644 --- a/Near/app/src/main/AndroidManifest.xml +++ b/Near/app/src/main/AndroidManifest.xml @@ -2,6 +2,8 @@ + + Date: Wed, 20 Aug 2025 23:50:28 +0900 Subject: [PATCH 09/13] =?UTF-8?q?fix:=20repository=20di=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EC=B2=B4=EB=A1=9C=20=EC=A3=BC=EC=9E=85=EB=B0=9B?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/alarmy/near/data/di/RepositoryModule.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 index df79caac..3dff6205 100644 --- 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 @@ -1,5 +1,6 @@ package com.alarmy.near.data.di +import com.alarmy.near.data.repository.DefaultFriendRepository import com.alarmy.near.data.repository.ExampleRepository import com.alarmy.near.data.repository.ExampleRepositoryImpl import com.alarmy.near.data.repository.FriendRepository @@ -18,5 +19,5 @@ interface RepositoryModule { @Binds @Singleton - abstract fun bindFriendRepository(friendRepository: FriendRepository): FriendRepository + abstract fun bindFriendRepository(friendRepository: DefaultFriendRepository): FriendRepository } From abc95d2d5865ade5611faf7acfd30fddcd10b072 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 20 Aug 2025 23:51:05 +0900 Subject: [PATCH 10/13] =?UTF-8?q?feat:=20friend=20api=20=EB=A1=9C=EB=94=A9?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/alarmy/near/network/service/FriendService.kt | 2 +- .../com/alarmy/near/presentation/feature/home/HomeScreen.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Near/app/src/main/java/com/alarmy/near/network/service/FriendService.kt b/Near/app/src/main/java/com/alarmy/near/network/service/FriendService.kt index eb353a89..a412dadc 100644 --- a/Near/app/src/main/java/com/alarmy/near/network/service/FriendService.kt +++ b/Near/app/src/main/java/com/alarmy/near/network/service/FriendService.kt @@ -4,6 +4,6 @@ import com.alarmy.near.network.response.FriendEntity import retrofit2.http.GET interface FriendService { - @GET + @GET("/friend/list") suspend fun fetchFriends(): List } 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 index 01b8a497..56fa7f29 100644 --- 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 @@ -67,7 +67,7 @@ internal fun HomeRoute( onAlarmClick: () -> Unit = {}, onMyPageClick: () -> Unit = {}, ) { - val uiState = viewModel.uiStateFlow.collectAsStateWithLifecycle() + val uiState = viewModel.friendsFlow.collectAsStateWithLifecycle() HomeScreen( onContactClick = {}, onAlarmClick = {}, From 964592e6e06b257af13a2f8cba88327a6fc8e031 Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Wed, 20 Aug 2025 23:51:21 +0900 Subject: [PATCH 11/13] =?UTF-8?q?chore:=20=EB=84=A4=EB=B9=84=EA=B2=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EA=B8=B0=EB=B3=B8=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=ED=99=88=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/alarmy/near/presentation/feature/main/NearNavHost.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index 239fa4e1..78d50a02 100644 --- 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 @@ -5,8 +5,8 @@ import androidx.compose.ui.Modifier import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import com.alarmy.near.presentation.feature.friendprofile.navigation.friendProfileNavGraph -import com.alarmy.near.presentation.feature.friendprofileedittor.navigation.RouteFriendProfileEditor import com.alarmy.near.presentation.feature.friendprofileedittor.navigation.friendProfileEditorNavGraph +import com.alarmy.near.presentation.feature.home.navigation.RouteHome import com.alarmy.near.presentation.feature.home.navigation.homeNavGraph @Composable @@ -21,7 +21,7 @@ internal fun NearNavHost( NavHost( modifier = modifier, navController = navController, - startDestination = RouteFriendProfileEditor, + startDestination = RouteHome, ) { friendProfileNavGraph(onShowErrorSnackBar = onShowSnackbar, onClickBackButton = { navController.popBackStack() From b2d500be963f08ca62bb961e3b1a59815f1c98a5 Mon Sep 17 00:00:00 2001 From: Covy Date: Thu, 21 Aug 2025 00:07:19 +0900 Subject: [PATCH 12/13] =?UTF-8?q?chore:=20=EB=B9=8C=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/android-pull-request-ci.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/android-pull-request-ci.yml b/.github/workflows/android-pull-request-ci.yml index 83f6fe88..5bb75fef 100644 --- a/.github/workflows/android-pull-request-ci.yml +++ b/.github/workflows/android-pull-request-ci.yml @@ -25,6 +25,24 @@ jobs: - name: set up Android SDK uses: android-actions/setup-android@v2 + - name: Access Near DEV_URL + env: + NEAR_DEV_URL: ${{ secrets.NEAR_DEV_URL }} + run: | + echo "NEAR_DEV_URL=\"NEAR_DEV_URL\"" >> local.properties + + - name: Access Near PROD_URL + env: + NEAR_DEV_URL: ${{ secrets.NEAR_PROD_URL }} + run: | + echo "NEAR_PROD_URL=\"NEAR_PROD_URL\"" >> local.properties + + - name: Access Near TEMP_TOKEN + env: + NEAR_DEV_URL: ${{ secrets.TEMP_TOKEN }} + run: | + echo "TEMP_TOKEN=\"TEMP_TOKEN\"" >> local.properties + - name: Grant execute permission for gradlew run: chmod +x gradlew From 39473ba5baa52b3448124c297b5a12ad5fc59b5b Mon Sep 17 00:00:00 2001 From: kwakjoohyeong Date: Thu, 21 Aug 2025 00:45:24 +0900 Subject: [PATCH 13/13] =?UTF-8?q?chore:=20build=20gradle=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=8D=BC=ED=8B=B0=20=EA=B5=AC=EC=84=B1=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Near/app/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/Near/app/build.gradle.kts b/Near/app/build.gradle.kts index 201141f8..bd42f1a5 100644 --- a/Near/app/build.gradle.kts +++ b/Near/app/build.gradle.kts @@ -31,6 +31,7 @@ android { "proguard-rules.pro", ) buildConfigField("String", "NEAR_URL", getProperty("NEAR_PROD_URL")) + buildConfigField("String", "TEMP_TOKEN", getProperty("TEMP_TOKEN")) // TODO 추후 삭제 필요 } debug { buildConfigField("String", "NEAR_URL", getProperty("NEAR_DEV_URL"))