diff --git a/build-logic/src/main/kotlin/com/titi/common/BuildInfo.kt b/build-logic/src/main/kotlin/com/titi/common/BuildInfo.kt index bc80103e..87641c5a 100644 --- a/build-logic/src/main/kotlin/com/titi/common/BuildInfo.kt +++ b/build-logic/src/main/kotlin/com/titi/common/BuildInfo.kt @@ -9,7 +9,7 @@ object BuildType { object AppConfig { const val APP_ID = "com.titi.app" - const val APP_VERSION_NAME = "1.4.10" - const val APP_VERSION_CODE = 52 + const val APP_VERSION_NAME = "1.4.11" + const val APP_VERSION_CODE = 54 const val APP_NAME = "TiTi" } \ No newline at end of file diff --git a/feature/log/src/main/kotlin/com/titi/app/feature/log/ui/LogScreen.kt b/feature/log/src/main/kotlin/com/titi/app/feature/log/ui/LogScreen.kt index 53d98601..3f9fed30 100644 --- a/feature/log/src/main/kotlin/com/titi/app/feature/log/ui/LogScreen.kt +++ b/feature/log/src/main/kotlin/com/titi/app/feature/log/ui/LogScreen.kt @@ -1,7 +1,6 @@ package com.titi.app.feature.log.ui import android.content.res.Configuration -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -27,6 +26,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -43,7 +43,6 @@ import com.titi.app.feature.log.ui.component.SettingBottomSheet import java.time.LocalDate import kotlinx.coroutines.launch -@OptIn(ExperimentalFoundationApi::class) @Composable fun LogScreen( viewModel: LogViewModel = mavericksViewModel(), @@ -52,6 +51,8 @@ fun LogScreen( ) { val scope = rememberCoroutineScope() val orientation = LocalConfiguration.current.orientation + val context = LocalContext.current + val isTablet = context.resources.configuration.smallestScreenWidthDp >= 600 val pagerState = rememberPagerState( pageCount = { @@ -138,7 +139,10 @@ fun LogScreen( }, ) - if (showSettingButton && orientation == Configuration.ORIENTATION_PORTRAIT) { + if ( + (showSettingButton && orientation == Configuration.ORIENTATION_PORTRAIT) || + (showSettingButton && isTablet) + ) { TdsIconButton( modifier = Modifier.align(Alignment.CenterEnd), onClick = { diff --git a/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiApp.kt b/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiApp.kt index 291b3d9b..8a6e9e82 100644 --- a/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiApp.kt +++ b/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiApp.kt @@ -34,7 +34,7 @@ import kotlinx.coroutines.launch @SuppressLint("UnusedContentLambdaTargetStateParameter") @Composable -fun TiTiApp(splashResultState: SplashResultState) { +fun TiTiApp(isConfigurationChange: Boolean, splashResultState: SplashResultState) { val requestPermissionLauncher = rememberLauncherForActivityResult( ActivityResultContracts.RequestPermission(), @@ -64,6 +64,7 @@ fun TiTiApp(splashResultState: SplashResultState) { TiTiNavHost( modifier = Modifier.fillMaxSize(), + isConfigurationChange = isConfigurationChange, splashResultState = splashResultState, onShowResetDailySnackBar = { date -> scope.launch { diff --git a/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiNavHost.kt b/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiNavHost.kt index 44340178..300115ef 100644 --- a/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiNavHost.kt +++ b/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiNavHost.kt @@ -39,6 +39,7 @@ import com.titi.app.feature.webview.webViewGraph @Composable fun TiTiNavHost( modifier: Modifier = Modifier, + isConfigurationChange: Boolean, splashResultState: SplashResultState, onShowResetDailySnackBar: (String) -> Unit, ) { @@ -46,7 +47,7 @@ fun TiTiNavHost( val context = LocalContext.current LaunchedEffect(Unit) { - if (splashResultState.recordTimes.recording) { + if (splashResultState.recordTimes.recording && !isConfigurationChange) { navController.navigateToMeasure(splashResultState.toJson()) } } diff --git a/feature/main/src/main/kotlin/com/titi/app/feature/main/ui/main/MainActivity.kt b/feature/main/src/main/kotlin/com/titi/app/feature/main/ui/main/MainActivity.kt index 67b09bd6..7716236b 100644 --- a/feature/main/src/main/kotlin/com/titi/app/feature/main/ui/main/MainActivity.kt +++ b/feature/main/src/main/kotlin/com/titi/app/feature/main/ui/main/MainActivity.kt @@ -2,24 +2,18 @@ package com.titi.app.feature.main.ui.main import android.os.Bundle import androidx.activity.ComponentActivity -import androidx.activity.SystemBarStyle import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import androidx.activity.viewModels import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import com.titi.app.core.designsystem.theme.TiTiTheme import com.titi.app.core.ui.removeNotification -import com.titi.app.domain.color.usecase.GetTimeColorFlowUseCase import com.titi.app.feature.main.navigation.TiTiApp import com.titi.app.tds.theme.TtdsTheme import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject @AndroidEntryPoint class MainActivity : ComponentActivity() { - @Inject - lateinit var getTimeColorFlowUseCase: GetTimeColorFlowUseCase - private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { @@ -31,22 +25,16 @@ class MainActivity : ComponentActivity() { viewModel.splashResultState == null } - enableEdgeToEdge( - statusBarStyle = SystemBarStyle.auto( - android.graphics.Color.TRANSPARENT, - android.graphics.Color.TRANSPARENT, - ), - navigationBarStyle = SystemBarStyle.auto( - android.graphics.Color.TRANSPARENT, - android.graphics.Color.TRANSPARENT, - ), - ) + enableEdgeToEdge() setContent { TiTiTheme { TtdsTheme { viewModel.splashResultState?.let { - TiTiApp(splashResultState = it) + TiTiApp( + splashResultState = it, + isConfigurationChange = savedInstanceState != null, + ) } } } diff --git a/feature/measure/src/main/kotlin/com/titi/app/feature/measure/ui/MeasuringScreen.kt b/feature/measure/src/main/kotlin/com/titi/app/feature/measure/ui/MeasuringScreen.kt index 4bf8f2ac..5b465250 100644 --- a/feature/measure/src/main/kotlin/com/titi/app/feature/measure/ui/MeasuringScreen.kt +++ b/feature/measure/src/main/kotlin/com/titi/app/feature/measure/ui/MeasuringScreen.kt @@ -34,14 +34,11 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalLifecycleOwner import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.app.NotificationCompat -import androidx.lifecycle.Lifecycle -import androidx.lifecycle.LifecycleEventObserver import com.airbnb.mvrx.asMavericksArgs import com.airbnb.mvrx.compose.collectAsState import com.airbnb.mvrx.compose.mavericksViewModel @@ -79,7 +76,6 @@ fun MeasuringScreen(splashResultState: String, onFinish: (isFinish: Boolean) -> val uiState by viewModel.collectAsState() val context = LocalContext.current - val lifecycleOwner = LocalLifecycleOwner.current var showSetExactAlarmPermissionDialog by remember { mutableStateOf(false) } val (alarmTitle, alarmFinishMessage, alarmFiveMinutesBeforeFinish) = @@ -98,6 +94,8 @@ fun MeasuringScreen(splashResultState: String, onFinish: (isFinish: Boolean) -> } val stopMeasuring = { + context.removeNotification() + viewModel.stopMeasuring( recordTimes = uiState.recordTimes, measureTime = uiState.measureTime, @@ -111,53 +109,14 @@ fun MeasuringScreen(splashResultState: String, onFinish: (isFinish: Boolean) -> } } - DisposableEffect(lifecycleOwner) { - val observer = LifecycleEventObserver { _, event -> - when (event) { - Lifecycle.Event.ON_CREATE, Lifecycle.Event.ON_START, - Lifecycle.Event.ON_ANY, Lifecycle.Event.ON_RESUME, - -> Unit - - Lifecycle.Event.ON_STOP, Lifecycle.Event.ON_PAUSE, Lifecycle.Event.ON_DESTROY -> { - if (!isFinish) { - makeInProgressNotification(context) - } - } - } - } - - lifecycleOwner.lifecycle.addObserver(observer) - onDispose { - lifecycleOwner.lifecycle.removeObserver(observer) - } - } - LaunchedEffect(isFinish) { if (isFinish) { stopMeasuring() - } else { - val timerTime = splashResultStateModel.recordTimes.savedTimerTime - val stopWatchTime = splashResultStateModel.recordTimes.savedStopWatchTime - val recordingMode = splashResultStateModel.recordTimes.recordingMode - - viewModel.setAlarm( - title = alarmTitle, - finishMessage = alarmFinishMessage, - fiveMinutesBeforeFinish = alarmFiveMinutesBeforeFinish, - measureTime = if (recordingMode == 1) { - timerTime - uiState.measureTime - } else { - stopWatchTime + uiState.measureTime - }, - ) - - showSetExactAlarmPermissionDialog = !viewModel.canSetAlarm() } } BackHandler { stopMeasuring() - context.removeNotification() } DisposableEffect(Unit) { @@ -171,6 +130,25 @@ fun MeasuringScreen(splashResultState: String, onFinish: (isFinish: Boolean) -> } LaunchedEffect(Unit) { + makeInProgressNotification(context) + + val timerTime = splashResultStateModel.recordTimes.savedTimerTime + val stopWatchTime = splashResultStateModel.recordTimes.savedStopWatchTime + val recordingMode = splashResultStateModel.recordTimes.recordingMode + + viewModel.setAlarm( + title = alarmTitle, + finishMessage = alarmFinishMessage, + fiveMinutesBeforeFinish = alarmFiveMinutesBeforeFinish, + measureTime = if (recordingMode == 1) { + timerTime - uiState.measureTime + } else { + stopWatchTime + uiState.measureTime + }, + ) + + showSetExactAlarmPermissionDialog = !viewModel.canSetAlarm() + viewModel.onFinish.collectLatest { if (it) { onFinish(uiState.measuringRecordTimes.savedTime <= 0L) @@ -208,7 +186,6 @@ fun MeasuringScreen(splashResultState: String, onFinish: (isFinish: Boolean) -> }, onFinishClick = { stopMeasuring() - context.removeNotification() }, ) } @@ -220,10 +197,12 @@ private fun MeasuringScreen( onFinishClick: () -> Unit, ) { val configuration = LocalConfiguration.current + val context = LocalContext.current + val isTablet = context.resources.configuration.smallestScreenWidthDp >= 600 Scaffold(containerColor = Color.Black) { - when (configuration.orientation) { - Configuration.ORIENTATION_PORTRAIT -> { + when { + configuration.orientation == Configuration.ORIENTATION_PORTRAIT || isTablet -> { Column( modifier = Modifier .fillMaxSize() diff --git a/feature/time/src/main/kotlin/com/titi/app/feature/time/ui/stopwatch/StopWatchScreen.kt b/feature/time/src/main/kotlin/com/titi/app/feature/time/ui/stopwatch/StopWatchScreen.kt index 739ab515..1b3d6f28 100644 --- a/feature/time/src/main/kotlin/com/titi/app/feature/time/ui/stopwatch/StopWatchScreen.kt +++ b/feature/time/src/main/kotlin/com/titi/app/feature/time/ui/stopwatch/StopWatchScreen.kt @@ -19,6 +19,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import com.airbnb.mvrx.asMavericksArgs import com.airbnb.mvrx.compose.collectAsState @@ -170,11 +171,13 @@ private fun StopWatchScreen( onNavigateToDestination: (TopLevelDestination) -> Unit, ) { val configuration = LocalConfiguration.current + val context = LocalContext.current + val isTablet = context.resources.configuration.smallestScreenWidthDp >= 600 Scaffold( containerColor = Color(uiState.timeColor.stopwatchBackgroundColor), bottomBar = { - if (configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { + if (configuration.orientation == Configuration.ORIENTATION_PORTRAIT || isTablet) { TdsBottomNavigationBar( currentTopLevelDestination = TopLevelDestination.STOPWATCH, bottomNavigationColor = uiState.timeColor.stopwatchBackgroundColor, @@ -183,8 +186,8 @@ private fun StopWatchScreen( } }, ) { - when (configuration.orientation) { - Configuration.ORIENTATION_PORTRAIT -> { + when { + configuration.orientation == Configuration.ORIENTATION_PORTRAIT || isTablet -> { Column( modifier = Modifier .fillMaxSize() diff --git a/feature/time/src/main/kotlin/com/titi/app/feature/time/ui/timer/TimerScreen.kt b/feature/time/src/main/kotlin/com/titi/app/feature/time/ui/timer/TimerScreen.kt index 2171539f..f517f783 100644 --- a/feature/time/src/main/kotlin/com/titi/app/feature/time/ui/timer/TimerScreen.kt +++ b/feature/time/src/main/kotlin/com/titi/app/feature/time/ui/timer/TimerScreen.kt @@ -20,6 +20,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp import com.airbnb.mvrx.asMavericksArgs import com.airbnb.mvrx.compose.collectAsState @@ -195,11 +196,13 @@ private fun TimerScreen( onNavigateToDestination: (TopLevelDestination) -> Unit, ) { val configuration = LocalConfiguration.current + val context = LocalContext.current + val isTablet = context.resources.configuration.smallestScreenWidthDp >= 600 Scaffold( containerColor = Color(uiState.timeColor.timerBackgroundColor), bottomBar = { - if (configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { + if (configuration.orientation == Configuration.ORIENTATION_PORTRAIT || isTablet) { TdsBottomNavigationBar( currentTopLevelDestination = TopLevelDestination.TIMER, bottomNavigationColor = uiState.timeColor.timerBackgroundColor, @@ -208,8 +211,8 @@ private fun TimerScreen( } }, ) { - when (configuration.orientation) { - Configuration.ORIENTATION_PORTRAIT -> { + when { + configuration.orientation == Configuration.ORIENTATION_PORTRAIT || isTablet -> { Column( modifier = Modifier .fillMaxSize() diff --git a/release-note.txt b/release-note.txt index 3cafdc5b..45e148af 100644 --- a/release-note.txt +++ b/release-note.txt @@ -1,2 +1,4 @@ -TiTi android 1.4.10 -- Special Characters 대응 \ No newline at end of file +TiTi android 1.4.11 +- 측정 시작 시 알림 +- 기록 두번 측정되는 현상 수정 +- 태블릿 ui 수정 \ No newline at end of file