From 236f58c2852faeb7660adbc0bc7e433ae03b3a22 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 5 Jun 2025 15:21:59 +0900 Subject: [PATCH 01/12] =?UTF-8?q?[ADD/#273]=20=ED=94=8C=EB=A0=88=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=ED=86=A0=EC=96=B4=20=EC=9D=B8=EC=95=B1=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EC=B6=94=EA=B0=80=ED=95=A9=EB=8B=88?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 3 +++ gradle/libs.versions.toml | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2eafa6da..e62a75f9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -123,6 +123,9 @@ dependencies { // Mavericks implementation(libs.bundles.mavericks) + // Play Store + implementation(libs.bundles.plays) + // ETC implementation(libs.timber) implementation(libs.lottie.compose) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bb253a92..fb65e83e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -50,6 +50,8 @@ firebase-config-ktx = "22.1.0" mavericks = "3.0.9" +play-review = "2.0.2" + [libraries] # AndroidX Core core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" } @@ -122,6 +124,10 @@ mavericks = { module = "com.airbnb.android:mavericks", version.ref = "mavericks" mavericks-compose = { module = "com.airbnb.android:mavericks-compose", version.ref = "mavericks" } mavericks-hilt = { module = "com.airbnb.android:mavericks-hilt", version.ref = "mavericks" } +# PlayStore In App Review +play-review = { group = "com.google.android.play", name = "review", version.ref = "play-review"} +play-review-ktx = { group = "com.google.android.play", name = "review-ktx", version.ref = "play-review"} + [plugins] android-application = { id = "com.android.application", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } @@ -193,3 +199,8 @@ mavericks = [ "mavericks-compose", "mavericks-hilt" ] + +plays = [ + "play-review", + "play-review-ktx" +] From 402cde0aa4558672247c94fe72d5d12d056bfe0c Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 5 Jun 2025 15:22:44 +0900 Subject: [PATCH 02/12] =?UTF-8?q?[FEAT/#273]=20=EC=9D=B8=EC=95=B1=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=EB=A5=BC=20=EC=9C=84=ED=95=9C=20InAppReviewM?= =?UTF-8?q?anager=EB=A5=BC=20=EC=A0=95=EC=9D=98=ED=95=A9=EB=8B=88=EB=8B=A4?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clody/core/review/InAppReviewManager.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt diff --git a/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt b/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt new file mode 100644 index 00000000..960d611c --- /dev/null +++ b/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt @@ -0,0 +1,25 @@ +package com.sopt.clody.core.review + +import android.app.Activity +import android.content.Intent +import android.net.Uri +import com.google.android.play.core.review.ReviewManagerFactory + +object InAppReviewManager { + fun showPopup(activity: Activity) { + val reviewManager = ReviewManagerFactory.create(activity) + val request = reviewManager.requestReviewFlow() + + request.addOnCompleteListener { task -> + if (task.isSuccessful) { + val reviewInfo = task.result + reviewManager.launchReviewFlow(activity, reviewInfo) + } else { + // fallback logic: 예를 들어 마켓 링크 열기 + val uri = Uri.parse("market://details?id=${activity.packageName}") + val intent = Intent(Intent.ACTION_VIEW, uri) + activity.startActivity(intent) + } + } + } +} From d0e33d4db7dbb7135424e76ed609736850739226 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 5 Jun 2025 15:23:42 +0900 Subject: [PATCH 03/12] =?UTF-8?q?[FEAT/#273]=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=EC=9D=84=20=EB=85=B8=EC=B6=9C=ED=95=A0=20?= =?UTF-8?q?=EC=A7=80=EC=97=90=20=EB=8C=80=ED=95=9C=20flag=EB=A5=BC=20?= =?UTF-8?q?=EB=8B=B4=EC=9D=80=20SharedPreferences=EB=A5=BC=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datastore/TokenDataStoreImpl.kt | 3 ++- .../datasource/AppReviewLocalDataSource.kt | 5 +++++ .../AppReviewLocalDataSourceImpl.kt | 19 +++++++++++++++++++ .../sopt/clody/di/SharedPreferencesModule.kt | 17 +++++++++++++++++ .../com/sopt/clody/di/TokenDataStoreModule.kt | 3 ++- .../com/sopt/clody/di/qualifier/Qualifier.kt | 11 +++++++++++ 6 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/sopt/clody/data/local/datasource/AppReviewLocalDataSource.kt create mode 100644 app/src/main/java/com/sopt/clody/data/local/datasourceimpl/AppReviewLocalDataSourceImpl.kt create mode 100644 app/src/main/java/com/sopt/clody/di/qualifier/Qualifier.kt diff --git a/app/src/main/java/com/sopt/clody/data/datastore/TokenDataStoreImpl.kt b/app/src/main/java/com/sopt/clody/data/datastore/TokenDataStoreImpl.kt index c71dda3f..04f62ef6 100644 --- a/app/src/main/java/com/sopt/clody/data/datastore/TokenDataStoreImpl.kt +++ b/app/src/main/java/com/sopt/clody/data/datastore/TokenDataStoreImpl.kt @@ -1,10 +1,11 @@ package com.sopt.clody.data.datastore import android.content.SharedPreferences +import com.sopt.clody.di.qualifier.TokenPrefs import javax.inject.Inject class TokenDataStoreImpl @Inject constructor( - private val sharedPreferences: SharedPreferences, + @TokenPrefs private val sharedPreferences: SharedPreferences, ) : TokenDataStore { override var accessToken: String get() = sharedPreferences.getString(ACCESS_TOKEN, "") ?: "" diff --git a/app/src/main/java/com/sopt/clody/data/local/datasource/AppReviewLocalDataSource.kt b/app/src/main/java/com/sopt/clody/data/local/datasource/AppReviewLocalDataSource.kt new file mode 100644 index 00000000..4c2c5992 --- /dev/null +++ b/app/src/main/java/com/sopt/clody/data/local/datasource/AppReviewLocalDataSource.kt @@ -0,0 +1,5 @@ +package com.sopt.clody.data.local.datasource + +interface AppReviewLocalDataSource { + var shouldShowPopup: Boolean +} diff --git a/app/src/main/java/com/sopt/clody/data/local/datasourceimpl/AppReviewLocalDataSourceImpl.kt b/app/src/main/java/com/sopt/clody/data/local/datasourceimpl/AppReviewLocalDataSourceImpl.kt new file mode 100644 index 00000000..3d20c1c3 --- /dev/null +++ b/app/src/main/java/com/sopt/clody/data/local/datasourceimpl/AppReviewLocalDataSourceImpl.kt @@ -0,0 +1,19 @@ +package com.sopt.clody.data.local.datasourceimpl + +import android.content.SharedPreferences +import com.sopt.clody.data.local.datasource.AppReviewLocalDataSource +import com.sopt.clody.di.qualifier.ReviewPrefs +import javax.inject.Inject + +class AppReviewLocalDataSourceImpl @Inject constructor( + @ReviewPrefs private val sharedPreferences: SharedPreferences, +) : AppReviewLocalDataSource { + + override var shouldShowPopup: Boolean + get() = sharedPreferences.getBoolean(SHOULD_SHOW_POPUP, true) + set(value) = sharedPreferences.edit().putBoolean(SHOULD_SHOW_POPUP, value).apply() + + companion object { + private const val SHOULD_SHOW_POPUP = "shouldShowPopup" + } +} diff --git a/app/src/main/java/com/sopt/clody/di/SharedPreferencesModule.kt b/app/src/main/java/com/sopt/clody/di/SharedPreferencesModule.kt index 4ea8c970..c27f9b34 100644 --- a/app/src/main/java/com/sopt/clody/di/SharedPreferencesModule.kt +++ b/app/src/main/java/com/sopt/clody/di/SharedPreferencesModule.kt @@ -2,6 +2,10 @@ package com.sopt.clody.di import android.content.Context import android.content.SharedPreferences +import com.sopt.clody.data.local.datasource.AppReviewLocalDataSource +import com.sopt.clody.data.local.datasourceimpl.AppReviewLocalDataSourceImpl +import com.sopt.clody.di.qualifier.ReviewPrefs +import com.sopt.clody.di.qualifier.TokenPrefs import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -14,7 +18,20 @@ import javax.inject.Singleton object SharedPreferencesModule { @Provides @Singleton + @TokenPrefs fun provideSharedPreferences(@ApplicationContext context: Context): SharedPreferences { return context.getSharedPreferences("token_prefs", Context.MODE_PRIVATE) } + + @Provides + @Singleton + @ReviewPrefs + fun provideReviewSharedPreferences(@ApplicationContext context: Context): SharedPreferences { + return context.getSharedPreferences("review_prefs", Context.MODE_PRIVATE) + } + + @Provides + @Singleton + fun provideAppReviewLocalDataSource(@ReviewPrefs sharedPreferences: SharedPreferences): AppReviewLocalDataSource = + AppReviewLocalDataSourceImpl(sharedPreferences) } diff --git a/app/src/main/java/com/sopt/clody/di/TokenDataStoreModule.kt b/app/src/main/java/com/sopt/clody/di/TokenDataStoreModule.kt index 3f1462ad..9f33f96d 100644 --- a/app/src/main/java/com/sopt/clody/di/TokenDataStoreModule.kt +++ b/app/src/main/java/com/sopt/clody/di/TokenDataStoreModule.kt @@ -3,6 +3,7 @@ package com.sopt.clody.di import android.content.SharedPreferences import com.sopt.clody.data.datastore.TokenDataStore import com.sopt.clody.data.datastore.TokenDataStoreImpl +import com.sopt.clody.di.qualifier.TokenPrefs import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -14,7 +15,7 @@ import javax.inject.Singleton object TokenDataStoreModule { @Provides @Singleton - fun provideTokenDataStore(sharedPreferences: SharedPreferences): TokenDataStore { + fun provideTokenDataStore(@TokenPrefs sharedPreferences: SharedPreferences): TokenDataStore { return TokenDataStoreImpl(sharedPreferences) } } diff --git a/app/src/main/java/com/sopt/clody/di/qualifier/Qualifier.kt b/app/src/main/java/com/sopt/clody/di/qualifier/Qualifier.kt new file mode 100644 index 00000000..a61d98ef --- /dev/null +++ b/app/src/main/java/com/sopt/clody/di/qualifier/Qualifier.kt @@ -0,0 +1,11 @@ +package com.sopt.clody.di.qualifier + +import javax.inject.Qualifier + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class TokenPrefs + +@Qualifier +@Retention(AnnotationRetention.BINARY) +annotation class ReviewPrefs From 0cc06d05e7e67a7ee6d4b6d977ca02dfc7668c67 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 5 Jun 2025 15:24:00 +0900 Subject: [PATCH 04/12] =?UTF-8?q?[FEAT/#273]=20=ED=99=88=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=A6=AC=EB=B7=B0=20=ED=8C=9D=EC=97=85?= =?UTF-8?q?=EC=9D=B4=20=EC=A0=95=EC=83=81=EC=A0=81=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=85=B8=EC=B6=9C=EB=90=98=EB=8A=94=EC=A7=80=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clody/presentation/ui/home/screen/HomeScreen.kt | 13 +++++++++++-- .../presentation/ui/home/screen/HomeViewModel.kt | 10 ++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt index 20a77086..f74f6d49 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.sopt.clody.core.review.InAppReviewManager import com.sopt.clody.domain.model.ReplyStatus import com.sopt.clody.presentation.ui.component.FailureScreen import com.sopt.clody.presentation.ui.component.LoadingScreen @@ -34,6 +35,7 @@ import com.sopt.clody.presentation.utils.amplitude.AmplitudeConstraints import com.sopt.clody.presentation.utils.amplitude.AmplitudeUtils import com.sopt.clody.presentation.utils.navigation.Route import com.sopt.clody.ui.theme.ClodyTheme +import timber.log.Timber import java.time.LocalDate @Composable @@ -56,6 +58,7 @@ fun HomeRoute( val calendarState by homeViewModel.calendarState.collectAsStateWithLifecycle() val dailyDiariesState by homeViewModel.dailyDiariesState.collectAsStateWithLifecycle() val replyStatus by homeViewModel.replyStatus.collectAsStateWithLifecycle() + val showInAppReviewPopup by homeViewModel.showInAppReviewPopup.collectAsStateWithLifecycle() val isError = calendarState is CalendarState.Error || dailyDiariesState is DailyDiariesState.Error val errorMessage = when { @@ -64,6 +67,12 @@ fun HomeRoute( else -> "" } + if (showInAppReviewPopup) { + InAppReviewManager.showPopup(LocalContext.current as Activity) + Timber.tag("showInAppReviewPopup").d(showInAppReviewPopup.toString()) + Timber.tag("InAppReview").d("인앱 리뷰 띄워라 !") + } + LaunchedEffect(Unit) { AmplitudeUtils.trackEvent(eventName = AmplitudeConstraints.HOME) } @@ -183,7 +192,7 @@ fun HomeScreen( containerColor = ClodyTheme.colors.white, content = { innerPadding -> when (val state = calendarState) { - is CalendarState.Idle -> { } + is CalendarState.Idle -> {} is CalendarState.Loading -> { LoadingScreen() @@ -211,7 +220,7 @@ fun HomeScreen( } when (deleteDiaryState) { - is DeleteDiaryState.Idle -> { } + is DeleteDiaryState.Idle -> {} is DeleteDiaryState.Loading -> { LoadingScreen() diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt index 86c97b0f..ea68f2a5 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt @@ -2,6 +2,7 @@ package com.sopt.clody.presentation.ui.home.screen import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.sopt.clody.data.local.datasource.AppReviewLocalDataSource import com.sopt.clody.data.remote.dto.response.DailyDiariesResponseDto import com.sopt.clody.data.remote.dto.response.MonthlyCalendarResponseDto import com.sopt.clody.data.remote.util.NetworkUtil @@ -19,6 +20,7 @@ import javax.inject.Inject class HomeViewModel @Inject constructor( private val diaryRepository: DiaryRepository, private val networkUtil: NetworkUtil, + private val appReviewLocalDataSource: AppReviewLocalDataSource, ) : ViewModel() { private val _calendarState = MutableStateFlow>(CalendarState.Idle) @@ -62,6 +64,9 @@ class HomeViewModel @Inject constructor( private val _showDiaryDeleteDialog = MutableStateFlow(false) val showDiaryDeleteDialog: StateFlow get() = _showDiaryDeleteDialog + private val _showInAppReviewPopup = MutableStateFlow(appReviewLocalDataSource.shouldShowPopup) + val showInAppReviewPopup: StateFlow get() = _showInAppReviewPopup + private val _errorState = MutableStateFlow>(false to "") val errorState: StateFlow> = _errorState @@ -179,4 +184,9 @@ class HomeViewModel @Inject constructor( fun setShowDiaryDeleteDialog(state: Boolean) { _showDiaryDeleteDialog.value = state } + + fun updateShowInAppReviewPopup(state: Boolean) { + appReviewLocalDataSource.shouldShowPopup = state + _showInAppReviewPopup.value = state + } } From 890880440ecd996b1d4c3daa3908125febab323c Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 5 Jun 2025 16:26:11 +0900 Subject: [PATCH 05/12] =?UTF-8?q?[FEAT/#273]=20=EB=8B=B5=EC=9E=A5=ED=99=95?= =?UTF-8?q?=EC=9D=B8=EC=9C=BC=EB=A1=9C=EB=B6=80=ED=84=B0=20=ED=99=88?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EB=8F=8C=EC=95=84?= =?UTF-8?q?=EC=99=94=EB=8A=94=20=EC=A7=80=EB=A5=BC=20=EA=B2=80=EC=82=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=BD=94=EB=93=9C=EB=A5=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/ui/home/navigation/HomeNavigation.kt | 4 +++- .../sopt/clody/presentation/ui/home/screen/HomeScreen.kt | 9 ++++++--- .../clody/presentation/ui/replydiary/ReplyDiaryScreen.kt | 6 +++--- .../ui/replydiary/navigation/ReplyDiaryNavigation.kt | 2 +- .../sopt/clody/presentation/utils/navigation/Route.kt | 1 + 5 files changed, 14 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/navigation/HomeNavigation.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/navigation/HomeNavigation.kt index 6cc39e2d..550a570b 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/navigation/HomeNavigation.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/navigation/HomeNavigation.kt @@ -28,6 +28,7 @@ fun NavGraphBuilder.homeScreen( selectedYear = selectedYear, selectedMonth = selectedMonth, selectedDay = selectedDay, + isFromReplyDiary = isFromReplyDiary, navigateToDiaryList = navigateToDiaryList, navigateToSetting = navigateToSetting, navigateToWriteDiary = navigateToWriteDiary, @@ -41,7 +42,8 @@ fun NavController.navigateToHome( selectedYear: Int = LocalDate.now().year, selectedMonth: Int = LocalDate.now().monthValue, selectedDay: Int? = LocalDate.now().dayOfMonth, + isFromReplyDiary: Boolean = false, navOptions: NavOptionsBuilder.() -> Unit = {}, ) { - navigate(Route.Home(selectedYear, selectedMonth, selectedDay), navOptions) + navigate(Route.Home(selectedYear, selectedMonth, selectedDay, isFromReplyDiary), navOptions) } diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt index f74f6d49..6f4574c1 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt @@ -43,6 +43,7 @@ fun HomeRoute( selectedYear: Int, selectedMonth: Int, selectedDay: Int?, + isFromReplyDiary: Boolean, navigateToDiaryList: (year: Int, month: Int) -> Unit, navigateToSetting: () -> Unit, navigateToWriteDiary: (year: Int, month: Int, date: Int) -> Unit, @@ -67,10 +68,12 @@ fun HomeRoute( else -> "" } - if (showInAppReviewPopup) { + Timber.tag("showInAppReviewPopup").d(showInAppReviewPopup.toString()) + Timber.tag("isFromReplyDiary").d(isFromReplyDiary.toString()) + + if (showInAppReviewPopup && isFromReplyDiary) { InAppReviewManager.showPopup(LocalContext.current as Activity) - Timber.tag("showInAppReviewPopup").d(showInAppReviewPopup.toString()) - Timber.tag("InAppReview").d("인앱 리뷰 띄워라 !") + homeViewModel.updateShowInAppReviewPopup(false) } LaunchedEffect(Unit) { diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/replydiary/ReplyDiaryScreen.kt b/app/src/main/java/com/sopt/clody/presentation/ui/replydiary/ReplyDiaryScreen.kt index c4aa168e..f112fc19 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/replydiary/ReplyDiaryScreen.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/replydiary/ReplyDiaryScreen.kt @@ -49,7 +49,7 @@ fun ReplyDiaryRoute( month: Int, date: Int, replyStatus: ReplyStatus, - navigateToHome: (year: Int, month: Int, date: Int) -> Unit, + navigateToHome: (year: Int, month: Int, date: Int, isFromReplyDiary: Boolean) -> Unit, viewModel: ReplyDiaryViewModel = hiltViewModel(), ) { val replyDiaryState by viewModel.replyDiaryState.collectAsState() @@ -65,7 +65,7 @@ fun ReplyDiaryRoute( BackHandler { val currentTime = System.currentTimeMillis() if (currentTime - backPressedTime <= backPressThreshold) { - navigateToHome(year, month, date) + navigateToHome(year, month, date, true) } else { backPressedTime = currentTime } @@ -79,7 +79,7 @@ fun ReplyDiaryRoute( is ReplyDiaryState.Success -> { val successState = replyDiaryState as ReplyDiaryState.Success ReplyDiaryScreen( - navigateToHome = { navigateToHome(year, month, date) }, + navigateToHome = { navigateToHome(year, month, date, true) }, replyStatus = replyStatus, replyDiaryState = successState, ) diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/replydiary/navigation/ReplyDiaryNavigation.kt b/app/src/main/java/com/sopt/clody/presentation/ui/replydiary/navigation/ReplyDiaryNavigation.kt index f1e5b161..492ea5f2 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/replydiary/navigation/ReplyDiaryNavigation.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/replydiary/navigation/ReplyDiaryNavigation.kt @@ -10,7 +10,7 @@ import com.sopt.clody.presentation.ui.replydiary.ReplyDiaryRoute import com.sopt.clody.presentation.utils.navigation.Route fun NavGraphBuilder.replyDiaryScreen( - navigateToHome: (year: Int, month: Int, date: Int) -> Unit, + navigateToHome: (year: Int, month: Int, date: Int, isFromReplyDiary: Boolean) -> Unit, ) { composable { backStackEntry -> backStackEntry.toRoute().apply { diff --git a/app/src/main/java/com/sopt/clody/presentation/utils/navigation/Route.kt b/app/src/main/java/com/sopt/clody/presentation/utils/navigation/Route.kt index 7c423e1e..334475b6 100644 --- a/app/src/main/java/com/sopt/clody/presentation/utils/navigation/Route.kt +++ b/app/src/main/java/com/sopt/clody/presentation/utils/navigation/Route.kt @@ -31,6 +31,7 @@ sealed interface Route { val selectedYear: Int, val selectedMonth: Int, val selectedDay: Int? = null, + val isFromReplyDiary: Boolean = false, ) : Route @Serializable From 7eb6053ced284c3a176dea8818543677613e02cc Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 5 Jun 2025 16:29:00 +0900 Subject: [PATCH 06/12] =?UTF-8?q?[REFACTOR/#273]=20LaunchedEffect=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD,=20context=20=EC=B4=88=EA=B8=B0=ED=99=94=20?= =?UTF-8?q?=EC=95=88=EC=A0=95=EC=84=B1=20=EC=A6=9D=EA=B0=80,=20Timber=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=EB=A5=BC=20=EC=88=98=ED=96=89=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/clody/presentation/ui/home/screen/HomeScreen.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt index 6f4574c1..8e05be83 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt @@ -60,6 +60,7 @@ fun HomeRoute( val dailyDiariesState by homeViewModel.dailyDiariesState.collectAsStateWithLifecycle() val replyStatus by homeViewModel.replyStatus.collectAsStateWithLifecycle() val showInAppReviewPopup by homeViewModel.showInAppReviewPopup.collectAsStateWithLifecycle() + val context = LocalContext.current val isError = calendarState is CalendarState.Error || dailyDiariesState is DailyDiariesState.Error val errorMessage = when { @@ -68,11 +69,8 @@ fun HomeRoute( else -> "" } - Timber.tag("showInAppReviewPopup").d(showInAppReviewPopup.toString()) - Timber.tag("isFromReplyDiary").d(isFromReplyDiary.toString()) - - if (showInAppReviewPopup && isFromReplyDiary) { - InAppReviewManager.showPopup(LocalContext.current as Activity) + LaunchedEffect(showInAppReviewPopup && isFromReplyDiary) { + InAppReviewManager.showPopup(context as Activity) homeViewModel.updateShowInAppReviewPopup(false) } From da8f6c4342543c864c69b02c2a18a4686bf97748 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Thu, 5 Jun 2025 16:32:36 +0900 Subject: [PATCH 07/12] =?UTF-8?q?[REFACTOR/#273]=20=EB=A6=AC=EB=B7=B0=20?= =?UTF-8?q?=ED=8C=9D=EC=97=85=20=EB=85=B8=EC=B6=9C=EC=97=90=20=EA=B4=80?= =?UTF-8?q?=ED=95=9C=20=EC=97=90=EB=9F=AC=20=EB=8C=80=EC=9D=91=EC=9D=84=20?= =?UTF-8?q?=EB=B3=B4=EC=99=84=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clody/core/review/InAppReviewManager.kt | 21 +++++++++++++++---- .../presentation/ui/home/screen/HomeScreen.kt | 1 - 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt b/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt index 960d611c..51254cde 100644 --- a/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt +++ b/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt @@ -4,9 +4,12 @@ import android.app.Activity import android.content.Intent import android.net.Uri import com.google.android.play.core.review.ReviewManagerFactory +import timber.log.Timber object InAppReviewManager { fun showPopup(activity: Activity) { + if (activity.isFinishing || activity.isDestroyed) return + val reviewManager = ReviewManagerFactory.create(activity) val request = reviewManager.requestReviewFlow() @@ -15,10 +18,20 @@ object InAppReviewManager { val reviewInfo = task.result reviewManager.launchReviewFlow(activity, reviewInfo) } else { - // fallback logic: 예를 들어 마켓 링크 열기 - val uri = Uri.parse("market://details?id=${activity.packageName}") - val intent = Intent(Intent.ACTION_VIEW, uri) - activity.startActivity(intent) + try { + val uri = Uri.parse("market://details?id=${activity.packageName}") + val intent = Intent(Intent.ACTION_VIEW, uri) + if (intent.resolveActivity(activity.packageManager) != null) { + activity.startActivity(intent) + } else { + val webUri = Uri.parse("https://play.google.com/store/apps/details?id=${activity.packageName}") + val webIntent = Intent(Intent.ACTION_VIEW, webUri) + activity.startActivity(webIntent) + } + } catch (e: Exception) { + e.printStackTrace() + Timber.e(e, "Failed to open store for app review") + } } } } diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt index 8e05be83..448918d1 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt @@ -35,7 +35,6 @@ import com.sopt.clody.presentation.utils.amplitude.AmplitudeConstraints import com.sopt.clody.presentation.utils.amplitude.AmplitudeUtils import com.sopt.clody.presentation.utils.navigation.Route import com.sopt.clody.ui.theme.ClodyTheme -import timber.log.Timber import java.time.LocalDate @Composable From 02cffb491aad022cfef61b323b433dda967b14c6 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Fri, 6 Jun 2025 15:06:16 +0900 Subject: [PATCH 08/12] =?UTF-8?q?[CHORE/#273]=20SharedPreferences=EC=9D=98?= =?UTF-8?q?=20property=20setter=EB=A5=BC=20=EA=B0=9C=EC=84=A0=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/local/datasourceimpl/AppReviewLocalDataSourceImpl.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/sopt/clody/data/local/datasourceimpl/AppReviewLocalDataSourceImpl.kt b/app/src/main/java/com/sopt/clody/data/local/datasourceimpl/AppReviewLocalDataSourceImpl.kt index 3d20c1c3..684eb9f6 100644 --- a/app/src/main/java/com/sopt/clody/data/local/datasourceimpl/AppReviewLocalDataSourceImpl.kt +++ b/app/src/main/java/com/sopt/clody/data/local/datasourceimpl/AppReviewLocalDataSourceImpl.kt @@ -1,6 +1,7 @@ package com.sopt.clody.data.local.datasourceimpl import android.content.SharedPreferences +import androidx.core.content.edit import com.sopt.clody.data.local.datasource.AppReviewLocalDataSource import com.sopt.clody.di.qualifier.ReviewPrefs import javax.inject.Inject @@ -11,7 +12,7 @@ class AppReviewLocalDataSourceImpl @Inject constructor( override var shouldShowPopup: Boolean get() = sharedPreferences.getBoolean(SHOULD_SHOW_POPUP, true) - set(value) = sharedPreferences.edit().putBoolean(SHOULD_SHOW_POPUP, value).apply() + set(value) = sharedPreferences.edit { putBoolean(SHOULD_SHOW_POPUP, value) } companion object { private const val SHOULD_SHOW_POPUP = "shouldShowPopup" From 0fa677fbd02a8de5d2d2e2537bf24ef3b0406986 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Fri, 6 Jun 2025 23:15:02 +0900 Subject: [PATCH 09/12] =?UTF-8?q?[REFACTOR/#273]=20ReviewRepository?= =?UTF-8?q?=EB=A5=BC=20=EC=A0=95=EC=9D=98=ED=95=98=EC=97=AC=20Repository?= =?UTF-8?q?=20Pattern=EC=9D=84=20=EC=A4=80=EC=88=98=ED=95=A9=EB=8B=88?= =?UTF-8?q?=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repositoryimpl/ReviewRepositoryImpl.kt | 15 +++++++++++++++ .../java/com/sopt/clody/di/RepositoryModule.kt | 8 ++++++++ .../clody/domain/repository/ReviewRepository.kt | 6 ++++++ .../presentation/ui/home/screen/HomeViewModel.kt | 8 ++++---- 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/sopt/clody/data/repositoryimpl/ReviewRepositoryImpl.kt create mode 100644 app/src/main/java/com/sopt/clody/domain/repository/ReviewRepository.kt diff --git a/app/src/main/java/com/sopt/clody/data/repositoryimpl/ReviewRepositoryImpl.kt b/app/src/main/java/com/sopt/clody/data/repositoryimpl/ReviewRepositoryImpl.kt new file mode 100644 index 00000000..7421396a --- /dev/null +++ b/app/src/main/java/com/sopt/clody/data/repositoryimpl/ReviewRepositoryImpl.kt @@ -0,0 +1,15 @@ +package com.sopt.clody.data.repositoryimpl + +import com.sopt.clody.data.local.datasource.AppReviewLocalDataSource +import com.sopt.clody.domain.repository.ReviewRepository +import javax.inject.Inject + +class ReviewRepositoryImpl @Inject constructor( + private val appReviewLocalDataSource: AppReviewLocalDataSource, +) : ReviewRepository { + override fun getShouldShowPopup(): Boolean = appReviewLocalDataSource.shouldShowPopup + + override fun setShouldShowPopup(state: Boolean) { + appReviewLocalDataSource.shouldShowPopup = state + } +} diff --git a/app/src/main/java/com/sopt/clody/di/RepositoryModule.kt b/app/src/main/java/com/sopt/clody/di/RepositoryModule.kt index 006a0064..899246ac 100644 --- a/app/src/main/java/com/sopt/clody/di/RepositoryModule.kt +++ b/app/src/main/java/com/sopt/clody/di/RepositoryModule.kt @@ -5,6 +5,7 @@ import com.sopt.clody.data.repositoryimpl.AdRepositoryImpl import com.sopt.clody.data.repositoryimpl.AuthRepositoryImpl import com.sopt.clody.data.repositoryimpl.DiaryRepositoryImpl import com.sopt.clody.data.repositoryimpl.NotificationRepositoryImpl +import com.sopt.clody.data.repositoryimpl.ReviewRepositoryImpl import com.sopt.clody.data.repositoryimpl.TokenReissueRepositoryImpl import com.sopt.clody.data.repositoryimpl.TokenRepositoryImpl import com.sopt.clody.domain.repository.AccountManagementRepository @@ -12,6 +13,7 @@ import com.sopt.clody.domain.repository.AdRepository import com.sopt.clody.domain.repository.AuthRepository import com.sopt.clody.domain.repository.DiaryRepository import com.sopt.clody.domain.repository.NotificationRepository +import com.sopt.clody.domain.repository.ReviewRepository import com.sopt.clody.domain.repository.TokenReissueRepository import com.sopt.clody.domain.repository.TokenRepository import dagger.Binds @@ -64,4 +66,10 @@ abstract class RepositoryModule { abstract fun bindAdRepository( adRepositoryImpl: AdRepositoryImpl, ): AdRepository + + @Binds + @Singleton + abstract fun bindReviewRepository( + reviewRepositoryImpl: ReviewRepositoryImpl, + ): ReviewRepository } diff --git a/app/src/main/java/com/sopt/clody/domain/repository/ReviewRepository.kt b/app/src/main/java/com/sopt/clody/domain/repository/ReviewRepository.kt new file mode 100644 index 00000000..044a0cf5 --- /dev/null +++ b/app/src/main/java/com/sopt/clody/domain/repository/ReviewRepository.kt @@ -0,0 +1,6 @@ +package com.sopt.clody.domain.repository + +interface ReviewRepository { + fun getShouldShowPopup(): Boolean + fun setShouldShowPopup(state: Boolean) +} diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt index ea68f2a5..ab6cb5f6 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeViewModel.kt @@ -2,11 +2,11 @@ package com.sopt.clody.presentation.ui.home.screen import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.sopt.clody.data.local.datasource.AppReviewLocalDataSource import com.sopt.clody.data.remote.dto.response.DailyDiariesResponseDto import com.sopt.clody.data.remote.dto.response.MonthlyCalendarResponseDto import com.sopt.clody.data.remote.util.NetworkUtil import com.sopt.clody.domain.repository.DiaryRepository +import com.sopt.clody.domain.repository.ReviewRepository import com.sopt.clody.presentation.ui.home.calendar.model.DiaryDateData import com.sopt.clody.presentation.utils.network.ErrorMessages import dagger.hilt.android.lifecycle.HiltViewModel @@ -20,7 +20,7 @@ import javax.inject.Inject class HomeViewModel @Inject constructor( private val diaryRepository: DiaryRepository, private val networkUtil: NetworkUtil, - private val appReviewLocalDataSource: AppReviewLocalDataSource, + private val reviewRepository: ReviewRepository, ) : ViewModel() { private val _calendarState = MutableStateFlow>(CalendarState.Idle) @@ -64,7 +64,7 @@ class HomeViewModel @Inject constructor( private val _showDiaryDeleteDialog = MutableStateFlow(false) val showDiaryDeleteDialog: StateFlow get() = _showDiaryDeleteDialog - private val _showInAppReviewPopup = MutableStateFlow(appReviewLocalDataSource.shouldShowPopup) + private val _showInAppReviewPopup = MutableStateFlow(reviewRepository.getShouldShowPopup()) val showInAppReviewPopup: StateFlow get() = _showInAppReviewPopup private val _errorState = MutableStateFlow>(false to "") @@ -186,7 +186,7 @@ class HomeViewModel @Inject constructor( } fun updateShowInAppReviewPopup(state: Boolean) { - appReviewLocalDataSource.shouldShowPopup = state + reviewRepository.setShouldShowPopup(state) _showInAppReviewPopup.value = state } } From 79a4ba9b0c284c2e73acfef5457f66b524b549a0 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Sat, 7 Jun 2025 01:02:42 +0900 Subject: [PATCH 10/12] =?UTF-8?q?[CHORE/#273]=20=EB=A7=88=EC=BC=93=20?= =?UTF-8?q?=EC=9D=B4=EB=8F=99=20=ED=95=A8=EC=88=98=EB=A5=BC=20AppUpdateUti?= =?UTF-8?q?ls=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/clody/core/review/InAppReviewManager.kt | 16 ++++------------ .../presentation/ui/home/screen/HomeScreen.kt | 6 +++++- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt b/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt index 51254cde..08b4c496 100644 --- a/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt +++ b/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt @@ -1,13 +1,13 @@ package com.sopt.clody.core.review import android.app.Activity -import android.content.Intent -import android.net.Uri +import android.content.Context import com.google.android.play.core.review.ReviewManagerFactory +import com.sopt.clody.presentation.utils.appupdate.AppUpdateUtils import timber.log.Timber object InAppReviewManager { - fun showPopup(activity: Activity) { + fun showPopup(activity: Activity, context: Context) { if (activity.isFinishing || activity.isDestroyed) return val reviewManager = ReviewManagerFactory.create(activity) @@ -19,15 +19,7 @@ object InAppReviewManager { reviewManager.launchReviewFlow(activity, reviewInfo) } else { try { - val uri = Uri.parse("market://details?id=${activity.packageName}") - val intent = Intent(Intent.ACTION_VIEW, uri) - if (intent.resolveActivity(activity.packageManager) != null) { - activity.startActivity(intent) - } else { - val webUri = Uri.parse("https://play.google.com/store/apps/details?id=${activity.packageName}") - val webIntent = Intent(Intent.ACTION_VIEW, webUri) - activity.startActivity(webIntent) - } + AppUpdateUtils.navigateToMarket(context) } catch (e: Exception) { e.printStackTrace() Timber.e(e, "Failed to open store for app review") diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt index 448918d1..66bb2308 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt @@ -35,6 +35,7 @@ import com.sopt.clody.presentation.utils.amplitude.AmplitudeConstraints import com.sopt.clody.presentation.utils.amplitude.AmplitudeUtils import com.sopt.clody.presentation.utils.navigation.Route import com.sopt.clody.ui.theme.ClodyTheme +import timber.log.Timber import java.time.LocalDate @Composable @@ -68,8 +69,11 @@ fun HomeRoute( else -> "" } + Timber.tag("showInAppReviewPopup").e(showInAppReviewPopup.toString()) + Timber.tag("isFromReplyDiary").e(isFromReplyDiary.toString()) + LaunchedEffect(showInAppReviewPopup && isFromReplyDiary) { - InAppReviewManager.showPopup(context as Activity) + InAppReviewManager.showPopup(context as Activity, context) homeViewModel.updateShowInAppReviewPopup(false) } From 1da7261315bd44eaad5c0a81ef6638b107c7c643 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Sat, 7 Jun 2025 01:09:11 +0900 Subject: [PATCH 11/12] =?UTF-8?q?[CHORE/#273]=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=20=EC=A0=84=EB=8B=AC=EC=9D=84=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/sopt/clody/core/review/InAppReviewManager.kt | 4 ++-- .../com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt b/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt index 08b4c496..1801b942 100644 --- a/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt +++ b/app/src/main/java/com/sopt/clody/core/review/InAppReviewManager.kt @@ -7,7 +7,7 @@ import com.sopt.clody.presentation.utils.appupdate.AppUpdateUtils import timber.log.Timber object InAppReviewManager { - fun showPopup(activity: Activity, context: Context) { + fun showPopup(activity: Activity) { if (activity.isFinishing || activity.isDestroyed) return val reviewManager = ReviewManagerFactory.create(activity) @@ -19,7 +19,7 @@ object InAppReviewManager { reviewManager.launchReviewFlow(activity, reviewInfo) } else { try { - AppUpdateUtils.navigateToMarket(context) + AppUpdateUtils.navigateToMarket(activity) } catch (e: Exception) { e.printStackTrace() Timber.e(e, "Failed to open store for app review") diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt index 66bb2308..09515e5f 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt @@ -73,7 +73,7 @@ fun HomeRoute( Timber.tag("isFromReplyDiary").e(isFromReplyDiary.toString()) LaunchedEffect(showInAppReviewPopup && isFromReplyDiary) { - InAppReviewManager.showPopup(context as Activity, context) + InAppReviewManager.showPopup(context as Activity) homeViewModel.updateShowInAppReviewPopup(false) } From 25d06c6bb000ed1e55f4787c8ab5fee0de291859 Mon Sep 17 00:00:00 2001 From: SYAAINN Date: Sat, 7 Jun 2025 01:16:21 +0900 Subject: [PATCH 12/12] =?UTF-8?q?[CHORE/#273]=20=EC=9D=B8=EC=95=B1?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20=ED=8C=9D=EC=97=85=20=EB=85=B8=EC=B6=9C=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EA=B2=80=EC=82=AC=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=EC=9D=84=20=EA=B0=9C=EC=84=A0=ED=95=A9=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clody/presentation/ui/home/screen/HomeScreen.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt index 09515e5f..fa7f9495 100644 --- a/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt +++ b/app/src/main/java/com/sopt/clody/presentation/ui/home/screen/HomeScreen.kt @@ -72,13 +72,13 @@ fun HomeRoute( Timber.tag("showInAppReviewPopup").e(showInAppReviewPopup.toString()) Timber.tag("isFromReplyDiary").e(isFromReplyDiary.toString()) - LaunchedEffect(showInAppReviewPopup && isFromReplyDiary) { - InAppReviewManager.showPopup(context as Activity) - homeViewModel.updateShowInAppReviewPopup(false) - } - LaunchedEffect(Unit) { AmplitudeUtils.trackEvent(eventName = AmplitudeConstraints.HOME) + + if (showInAppReviewPopup && isFromReplyDiary) { + InAppReviewManager.showPopup(context as Activity) + homeViewModel.updateShowInAppReviewPopup(false) + } } LaunchedEffect(selectedYear, selectedMonth, selectedDay) {