diff --git a/presentation/src/main/java/daily/dayo/presentation/activity/MainActivity.kt b/presentation/src/main/java/daily/dayo/presentation/activity/MainActivity.kt index 678e8a4c..0c90dcb1 100644 --- a/presentation/src/main/java/daily/dayo/presentation/activity/MainActivity.kt +++ b/presentation/src/main/java/daily/dayo/presentation/activity/MainActivity.kt @@ -45,7 +45,8 @@ class MainActivity : AppCompatActivity() { MainScreen( onAdRequest = { onRewardSuccess -> showAdIfAvailable(onRewardSuccess) - } + }, + onExit = { finish() } ) } } diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/main/MainNavigator.kt b/presentation/src/main/java/daily/dayo/presentation/screen/main/MainNavigator.kt index f74bd775..2177b76d 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/main/MainNavigator.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/main/MainNavigator.kt @@ -212,8 +212,13 @@ class MainNavigator( navController.navigatePostLikeUsers(postId = postId) } - fun navigateUp() { - navController.navigateUp() + fun navigateUp(): Boolean { + return if (navController.previousBackStackEntry != null) { + navController.navigateUp() + true + } else { + false + } } @Composable diff --git a/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt b/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt index 49a43dc1..c9fc510a 100644 --- a/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt +++ b/presentation/src/main/java/daily/dayo/presentation/screen/main/MainScreen.kt @@ -1,5 +1,7 @@ package daily.dayo.presentation.screen.main +import android.widget.Toast +import androidx.activity.compose.BackHandler import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.animation.ExperimentalSharedTransitionApi @@ -30,6 +32,7 @@ import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -37,6 +40,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.tooling.preview.Preview @@ -78,6 +82,7 @@ import kotlinx.coroutines.launch @Composable internal fun MainScreen( onAdRequest: (onRewardSuccess: () -> Unit) -> Unit, + onExit: () -> Unit, navigator: MainNavigator = rememberMainNavigator(), profileViewModel: ProfileViewModel = hiltViewModel() ) { @@ -92,6 +97,22 @@ internal fun MainScreen( derivedStateOf { if (bottomSheetState.bottomSheetState.currentValue == SheetValue.Expanded) 0.6f else 0f } } val animatedDimAlpha by animateFloatAsState(targetValue = bottomSheetDimAlpha) + val context = LocalContext.current + var lastBackPressedTime by remember { mutableLongStateOf(0L) } + val toast = remember { Toast.makeText(context, context.getString(R.string.main_finish_toast), Toast.LENGTH_SHORT) } + + BackHandler { + if (!navigator.navigateUp()) { // 뒤로갈 화면 없는 경우 + val currentTime = System.currentTimeMillis() + if (currentTime - lastBackPressedTime < 2000) { + toast?.cancel() + onExit() // 앱 종료 + } else { + lastBackPressedTime = currentTime + toast?.show() + } + } + } SharedTransitionLayout { BottomSheetScaffold( diff --git a/presentation/src/main/res/values/strings.xml b/presentation/src/main/res/values/strings.xml index 59f0ed44..5d3993ad 100644 --- a/presentation/src/main/res/values/strings.xml +++ b/presentation/src/main/res/values/strings.xml @@ -55,6 +55,9 @@ DENIED EXPLAINED + + 한 번 더 누르면 앱이 종료됩니다. + 인기가 많은 다꾸들을 구경할 수 있어요 내 취향의 다꾸러들을 팔로우하고 모아볼 수 있어요