diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SetReminderActivity.kt b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SetReminderActivity.kt index 9d0b27ce..372c7e5c 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SetReminderActivity.kt +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/SetReminderActivity.kt @@ -11,6 +11,7 @@ import androidx.activity.enableEdgeToEdge import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.FlowRow import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsetsSides @@ -25,6 +26,7 @@ import androidx.compose.material3.AlertDialog import androidx.compose.material3.DatePicker import androidx.compose.material3.DatePickerDialog import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExperimentalMaterial3ExpressiveApi import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -36,7 +38,6 @@ import androidx.compose.material3.TopAppBarDefaults.enterAlwaysScrollBehavior import androidx.compose.material3.rememberDatePickerState import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableLongStateOf import androidx.compose.runtime.mutableStateOf @@ -47,7 +48,6 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -61,6 +61,7 @@ import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase import ml.docilealligator.infinityforreddit.comment.Comment import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper import ml.docilealligator.infinityforreddit.customviews.compose.AppTheme +import ml.docilealligator.infinityforreddit.customviews.compose.CustomFilledButton import ml.docilealligator.infinityforreddit.customviews.compose.CustomNeutralTextButton import ml.docilealligator.infinityforreddit.customviews.compose.CustomPositiveTextButton import ml.docilealligator.infinityforreddit.customviews.compose.LocalAppTheme @@ -127,7 +128,12 @@ class SetReminderActivity: BaseActivity() { } } - @OptIn(ExperimentalMaterial3Api::class) + private class ReminderPredefinedTime( + val textOnButton: String, + val timeInMillis: Long + ) + + @OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3ExpressiveApi::class) override fun onCreate(savedInstanceState: Bundle?) { ((application) as Infinity).appComponent.inject(this) @@ -153,7 +159,7 @@ class SetReminderActivity: BaseActivity() { val windowInsetsController = WindowInsetsControllerCompat(window, window.decorView) windowInsetsController.isAppearanceLightStatusBars = customThemeWrapper.isLightStatusBar - val currentTime = Calendar.getInstance() + val calendar = Calendar.getInstance() val formatter = DateTimeFormatter.ofPattern( mSharedPreferences.getString( SharedPreferencesUtils.TIME_FORMAT_KEY, @@ -161,6 +167,33 @@ class SetReminderActivity: BaseActivity() { ), Locale.getDefault() ) + val reminderPresetTimes = listOf( + ReminderPredefinedTime( + getString(R.string.in_6_hours), + 6 * 60 * 60 * 1000 + ), + ReminderPredefinedTime( + getString(R.string.in_1_day), + 24 * 60 * 60 * 1000 + ), + ReminderPredefinedTime( + getString(R.string.in_2_days), + 48 * 60 * 60 * 1000 + ), + ReminderPredefinedTime( + getString(R.string.in_3_days), + 72 * 60 * 60 * 1000 + ), + ReminderPredefinedTime( + getString(R.string.in_1_week), + 7 * 24 * 60 * 60 * 1000 + ), + ReminderPredefinedTime( + getString(R.string.in_2_weeks), + 14 * 24 * 60 * 60 * 1000 + ) + ) + setContent { AppTheme(customThemeWrapper.themeType, mSharedPreferences) { val context = LocalContext.current @@ -170,21 +203,24 @@ class SetReminderActivity: BaseActivity() { mViewModel.content } - var showDatePicker by remember { mutableStateOf(false) } - var showTimePicker by remember { mutableStateOf(false) } - val datePickerState = rememberDatePickerState() - val timePickerState = rememberTimePickerState( - initialHour = currentTime.get(Calendar.HOUR_OF_DAY), - initialMinute = currentTime.get(Calendar.MINUTE), - is24Hour = true, - ) var reminderTimeMillis: Long by remember { - mutableLongStateOf(0) + mutableLongStateOf(System.currentTimeMillis() + 60 * 60 * 24 * 1000) } var reminderTimeString: String by remember { mutableStateOf("") } + var showDatePicker by remember { mutableStateOf(false) } + var showTimePicker by remember { mutableStateOf(false) } + val datePickerState = rememberDatePickerState( + initialSelectedDateMillis = reminderTimeMillis + ) + val timePickerState = rememberTimePickerState( + initialHour = calendar.get(Calendar.HOUR_OF_DAY), + initialMinute = calendar.get(Calendar.MINUTE), + is24Hour = true, + ) + val setReminderResult by mViewModel.setReminderResult.collectAsStateWithLifecycle() val snackbarHostState = remember { SnackbarHostState() } @@ -276,6 +312,45 @@ class SetReminderActivity: BaseActivity() { color = Color(LocalAppTheme.current.dividerColor) ) + PrimaryText( + R.string.choose_a_predefined_reminder_time, + modifier = Modifier + .padding(horizontal = 16.dp) + .padding(top = 16.dp, bottom = 8.dp), + fontSize = LocalTypography.current.fontSize.size16 + ) + + FlowRow( + Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp) + .padding(top = 8.dp, bottom = 16.dp), + horizontalArrangement = Arrangement.SpaceAround, + verticalArrangement = Arrangement.spacedBy(8.dp), + ) { + reminderPresetTimes.forEachIndexed { _, reminderPresetTime -> + CustomFilledButton(text = reminderPresetTime.textOnButton) { + val reminderTime = reminderPresetTime.timeInMillis + System.currentTimeMillis() + datePickerState.selectedDateMillis = reminderTime + ZonedDateTime.now().offset.totalSeconds * 1000 + calendar.timeInMillis = reminderTime + timePickerState.hour = calendar.get(Calendar.HOUR_OF_DAY) + timePickerState.minute = calendar.get(Calendar.MINUTE) + } + } + } + + HorizontalDivider( + color = Color(LocalAppTheme.current.dividerColor) + ) + + PrimaryText( + R.string.or_set_a_custom_reminder_time, + modifier = Modifier + .padding(horizontal = 16.dp) + .padding(top = 16.dp), + fontSize = LocalTypography.current.fontSize.size16 + ) + Row( modifier = Modifier .fillMaxWidth(1f) @@ -296,11 +371,15 @@ class SetReminderActivity: BaseActivity() { } if (!reminderTimeString.isEmpty()) { + HorizontalDivider( + color = Color(LocalAppTheme.current.dividerColor) + ) + PrimaryText( R.string.you_will_receive_reminder_notification, modifier = Modifier .padding(horizontal = 16.dp) - .padding(bottom = 8.dp) + .padding(top = 16.dp, bottom = 8.dp) ) Row( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index ca39f44f..bc5f3cc1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1654,6 +1654,14 @@ Copying Set Reminder + Choose a predefined reminder time: + In 6 hours + In 1 day + In 2 days + In 3 days + In 1 week + In 2 weeks + Or, set a custom reminder time: Set Date Set Time You\'ll receive a reminder notification on the date and time you set: