diff --git a/common/src/main/java/com/doyoonkim/common/theme/Color.kt b/common/src/main/java/com/doyoonkim/common/theme/Color.kt index cd9a5ec2..9052e620 100644 --- a/common/src/main/java/com/doyoonkim/common/theme/Color.kt +++ b/common/src/main/java/com/doyoonkim/common/theme/Color.kt @@ -32,10 +32,10 @@ val TitleWhite = Color(0xFFFFFFFF) val SubtitleAny = Color(0xFF787879) -val ButtonLight = Color(0xFF3C3C3C) -val ButtonDark = Color(0xFF888888) +val ButtonDark = Color(0xFF3C3C3C) +val ButtonLight = Color(0xFFF3F3F3) -val GradientStartDark = Color(0xFF444444) +val GradientStartDark = Color(0xFF4F4F4F) val GradientStartLight = Color(0xFFA1A1A1) val GradientIntermediateDark = Color(0xFF5C5C5C) diff --git a/common/src/main/java/com/doyoonkim/common/ui/CircleGoButton.kt b/common/src/main/java/com/doyoonkim/common/ui/CircleGoButton.kt new file mode 100644 index 00000000..484dce50 --- /dev/null +++ b/common/src/main/java/com/doyoonkim/common/ui/CircleGoButton.kt @@ -0,0 +1,37 @@ +package com.doyoonkim.common.ui + +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.KeyboardArrowRight +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.IconButtonDefaults +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color + +@Composable +fun CircleGoButton( + modifier: Modifier = Modifier, + onClick: () -> Unit, + containerColor: Color = Color.Gray, + contentColor: Color = Color.LightGray +) { + IconButton( + onClick = onClick, + modifier = modifier + .wrapContentSize() + .clip(CircleShape), + colors = IconButtonDefaults.iconButtonColors().copy( + containerColor = containerColor, + contentColor = contentColor + ) + ) { + Icon( + imageVector = Icons.AutoMirrored.Default.KeyboardArrowRight, + contentDescription = "Go" + ) + } +} \ No newline at end of file diff --git a/common/src/main/java/com/doyoonkim/common/ui/RoundedCornerColumn.kt b/common/src/main/java/com/doyoonkim/common/ui/RoundedCornerColumn.kt new file mode 100644 index 00000000..c029e221 --- /dev/null +++ b/common/src/main/java/com/doyoonkim/common/ui/RoundedCornerColumn.kt @@ -0,0 +1,54 @@ +package com.doyoonkim.common.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Surface +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp + +@Composable +fun RoundedCornerColumn( + modifier: Modifier = Modifier, + verticalArrangement: Arrangement.Vertical = Arrangement.Top, + horizontalAlignment: Alignment.Horizontal = Alignment.Start, + cornerRadius: Dp = 15.dp, + backgroundColor: Color, + content: @Composable (ColumnScope.() -> Unit) +) { + + Surface( + modifier = modifier + .wrapContentSize() + .background(Color.Transparent) + .clip(RoundedCornerShape(cornerRadius)), + color = backgroundColor + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 10.dp), + verticalArrangement = verticalArrangement, + horizontalAlignment = horizontalAlignment, + content = content + ) + } + +} + +@Preview(showBackground = true) +@Composable +fun RoundedCornerColumn_Preview() { + +} \ No newline at end of file diff --git a/common/src/main/java/com/doyoonkim/common/ui/RoundedCornerColumnItem.kt b/common/src/main/java/com/doyoonkim/common/ui/RoundedCornerColumnItem.kt new file mode 100644 index 00000000..32f19d5f --- /dev/null +++ b/common/src/main/java/com/doyoonkim/common/ui/RoundedCornerColumnItem.kt @@ -0,0 +1,135 @@ +package com.doyoonkim.common.ui + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.PaddingValues +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.material3.HorizontalDivider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp + +enum class TextSize { Large, Medium, Small } + +@Composable +fun RoundedCornerColumnTextItemWithExtraOnRight( + modifier: Modifier = Modifier, + verticalPadding: Dp = 0.dp, + titleText: String, + subTitleText: String? = "Subtitle", + fontSize: TextSize = TextSize.Medium, + primaryColor: Color = Color.Black, + secondaryColor: Color = Color.Gray, + hasBottomDivider: Boolean = true, + extraOnRight: @Composable () -> Unit +) { + Row( + modifier = Modifier.fillMaxWidth().wrapContentHeight(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceEvenly + ) { + RoundedCornerColumnTextItem( + modifier = modifier.weight(4f), + verticalPadding = verticalPadding, + titleText = titleText, + subTitleText = subTitleText, + textSize = fontSize, + primaryColor = primaryColor, + secondaryColor = secondaryColor, + hasBottomDivider = hasBottomDivider + ) + extraOnRight() + } +} + +@Composable +fun RoundedCornerColumnTextItem( + modifier: Modifier = Modifier, + verticalPadding: Dp = 0.dp, + titleText: String, + subTitleText: String? = "Subtitle", + textSize: TextSize = TextSize.Medium, + primaryColor: Color = Color.Black, + secondaryColor: Color = Color.Gray, + hasBottomDivider: Boolean = true +) { + val extra = if (subTitleText == null) 10.dp else 0.dp + val fontSize = when (textSize) { + TextSize.Large -> Pair(24, 20) + TextSize.Medium -> Pair(18, 14) + TextSize.Small -> Pair(14, 10) + } + + RoundedCornerColumnItem( + modifier = modifier, + verticalPadding = verticalPadding, + extra = extra, + hasBottomDivider = hasBottomDivider, + dividerColor = secondaryColor + ) { + Text( + text = titleText, + color = primaryColor, + fontWeight = FontWeight.SemiBold, + fontSize = fontSize.first.sp, + textAlign = TextAlign.Start, + modifier = Modifier.fillMaxWidth().padding(start = 10.dp) + ) + + subTitleText?.let { + Text( + text = it, + color = secondaryColor, + fontWeight = FontWeight.Normal, + fontSize = fontSize.second.sp, + textAlign = TextAlign.Start, + modifier = Modifier.fillMaxWidth().padding(start = 10.dp) + ) + } + } +} + +@Composable +fun RoundedCornerColumnItem( + modifier: Modifier = Modifier, + verticalPadding: Dp = 0.dp, + extra: Dp = 0.dp, + hasBottomDivider: Boolean = true, + dividerColor: Color = Color.Gray, + content: @Composable (ColumnScope.() -> Unit) +) { + + val columnPadding = if (hasBottomDivider) { + PaddingValues(top = verticalPadding + extra) + } else { + PaddingValues(vertical = verticalPadding + extra) + } + + Column( + modifier = modifier + .padding(columnPadding), + verticalArrangement = Arrangement.SpaceEvenly, + horizontalAlignment = Alignment.CenterHorizontally + ) { + + content() + + if (hasBottomDivider) { + HorizontalDivider( + Modifier.padding(top = verticalPadding + extra), + color = dividerColor + ) + } + } +} \ No newline at end of file diff --git a/common/src/main/res/values-ko-rKR/strings.xml b/common/src/main/res/values-ko-rKR/strings.xml index 17329c24..e242670d 100644 --- a/common/src/main/res/values-ko-rKR/strings.xml +++ b/common/src/main/res/values-ko-rKR/strings.xml @@ -8,7 +8,7 @@ 더보기 브라우저에서 더보기 서비스 알림 - 새로운 공지사항이 등록되면 푸시 알림으로 알려드려요. + 새로운 공지사항이 등록되면 푸시 알림을 받을래요. 더보기 버전정보 오픈소스 라이센스 diff --git a/feature/bookmark/src/main/java/com/doyoonkim/bookmark/edit/EditBookmarkScreen.kt b/feature/bookmark/src/main/java/com/doyoonkim/bookmark/edit/EditBookmarkScreen.kt index c7b5434d..8bb8fbee 100644 --- a/feature/bookmark/src/main/java/com/doyoonkim/bookmark/edit/EditBookmarkScreen.kt +++ b/feature/bookmark/src/main/java/com/doyoonkim/bookmark/edit/EditBookmarkScreen.kt @@ -4,12 +4,9 @@ import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically -import androidx.compose.foundation.background -import androidx.compose.foundation.border import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets @@ -34,7 +31,6 @@ import androidx.compose.material3.BasicAlertDialog import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Switch @@ -46,10 +42,8 @@ import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -63,15 +57,16 @@ import com.doyoonkim.common.navigation.NoticeDetail import com.doyoonkim.common.R import com.doyoonkim.common.theme.buttonPurple import com.doyoonkim.common.theme.containerBackground -import com.doyoonkim.common.theme.containerGray import com.doyoonkim.common.theme.subTitle import com.doyoonkim.common.theme.textPurple import com.doyoonkim.common.theme.title import com.doyoonkim.common.ui.DatePickerDialog import com.doyoonkim.common.ui.NotificationPreviewCard +import com.doyoonkim.common.ui.RoundedCornerColumn +import com.doyoonkim.common.ui.RoundedCornerColumnItem +import com.doyoonkim.common.ui.RoundedCornerColumnTextItemWithExtraOnRight +import com.doyoonkim.common.ui.TextSize import com.doyoonkim.common.ui.TimePickerDialog -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -115,36 +110,18 @@ fun EditBookmarkScreen( Spacer(Modifier.height(30.dp)) - Text( - text = stringResource(R.string.subtitle_set_reminder), - fontSize = 16.sp, - fontWeight = FontWeight.Normal, - color = MaterialTheme.colorScheme.title - ) - - Column( - modifier = Modifier.fillMaxWidth().wrapContentHeight() - .background(Color.Transparent) - .clip(RoundedCornerShape(10.dp)) - .border(2.dp, MaterialTheme.colorScheme.containerBackground) - .padding(start = 10.dp, end = 10.dp), - verticalArrangement = Arrangement.SpaceEvenly, - horizontalAlignment = Alignment.CenterHorizontally - ) { - Row( - modifier = Modifier.fillMaxWidth().wrapContentHeight(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center + RoundedCornerColumn( + backgroundColor = MaterialTheme.colorScheme.containerBackground + ) { + RoundedCornerColumnTextItemWithExtraOnRight( + verticalPadding = 12.dp, + titleText = stringResource(R.string.subtitle_get_reminder), + subTitleText = null, + fontSize = TextSize.Small, + primaryColor = MaterialTheme.colorScheme.title, + secondaryColor = MaterialTheme.colorScheme.subTitle, + hasBottomDivider = uiState.isReminderRequested ) { - Text( - text = stringResource(R.string.subtitle_get_reminder), - textAlign = TextAlign.Start, - fontSize = 15.sp, - fontWeight = FontWeight.SemiBold, - color = MaterialTheme.colorScheme.title, - modifier = Modifier.padding(10.dp).weight(5f) - ) - Switch( checked = uiState.isReminderRequested && uiState.alarmPermissionStatus, enabled = true, @@ -157,48 +134,42 @@ fun EditBookmarkScreen( ) } - if (uiState.isReminderRequested) { - HorizontalDivider( - modifier = Modifier - .fillMaxWidth() - .padding(PaddingValues(horizontal = 5.dp)), - color = MaterialTheme.colorScheme.containerGray - ) - } - AnimatedVisibility( modifier = Modifier.fillMaxWidth().wrapContentHeight(), visible = uiState.isReminderRequested, enter = slideInVertically(), exit = slideOutVertically() ) { - - Row( - modifier = Modifier - .fillMaxWidth() - .wrapContentHeight() - .padding(PaddingValues(vertical = 15.dp)), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.spacedBy(3.dp) + RoundedCornerColumnItem( + verticalPadding = 12.dp, + hasBottomDivider = false, ) { - Text( - text = stringResource(R.string.text_set_reminder_date_time), - textAlign = TextAlign.Start, - fontSize = 15.sp, - fontWeight = FontWeight.SemiBold, - color = MaterialTheme.colorScheme.title, - modifier = Modifier.padding(10.dp).weight(2f) - ) + Row( + modifier = Modifier + .fillMaxWidth() + .wrapContentHeight(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(3.dp) + ) { + Text( + text = stringResource(R.string.text_set_reminder_date_time), + textAlign = TextAlign.Start, + fontSize = 14.sp, + fontWeight = FontWeight.SemiBold, + color = MaterialTheme.colorScheme.title, + modifier = Modifier.padding(10.dp).weight(2f) + ) - DatePickerDialog( - initialTime = uiState.timeForRemind - ) { year, month, day -> - viewModel.updateDateInfo(year, month, day) - } - TimePickerDialog( - initialTime = uiState.timeForRemind - ) { hour, min -> - viewModel.updateTimeInfo(hour, min) + DatePickerDialog( + initialTime = uiState.timeForRemind + ) { year, month, day -> + viewModel.updateDateInfo(year, month, day) + } + TimePickerDialog( + initialTime = uiState.timeForRemind + ) { hour, min -> + viewModel.updateTimeInfo(hour, min) + } } } } @@ -210,7 +181,8 @@ fun EditBookmarkScreen( text = stringResource(R.string.subtitle_notes), fontSize = 16.sp, fontWeight = FontWeight.Normal, - color = MaterialTheme.colorScheme.title + color = MaterialTheme.colorScheme.title, + modifier = Modifier.padding(10.dp) ) Box( diff --git a/feature/main/src/main/java/com/doyoonkim/main/preference/NotificationPreferencesScreen.kt b/feature/main/src/main/java/com/doyoonkim/main/preference/NotificationPreferencesScreen.kt index 2ef0d4cb..84e24106 100644 --- a/feature/main/src/main/java/com/doyoonkim/main/preference/NotificationPreferencesScreen.kt +++ b/feature/main/src/main/java/com/doyoonkim/main/preference/NotificationPreferencesScreen.kt @@ -8,23 +8,12 @@ import android.content.Intent import android.content.pm.PackageManager import androidx.activity.compose.BackHandler import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBars -import androidx.compose.foundation.layout.windowInsetsPadding -import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.CircularProgressIndicator -import androidx.compose.material3.Text -import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Switch @@ -38,10 +27,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat import androidx.lifecycle.Lifecycle import androidx.lifecycle.compose.LifecycleEventEffect @@ -52,7 +38,8 @@ import com.doyoonkim.common.theme.containerBackground import com.doyoonkim.common.theme.subTitle import com.doyoonkim.common.theme.textPurple import com.doyoonkim.common.theme.title -import com.doyoonkim.common.ui.LabeledToggleSwitch +import com.doyoonkim.common.ui.RoundedCornerColumn +import com.doyoonkim.common.ui.RoundedCornerColumnTextItemWithExtraOnRight import com.doyoonkim.main.viewmodel.NotificationPreferencesViewModel @Composable @@ -85,143 +72,145 @@ fun NotificationPreferencesScreen( ) } - Box( - modifier = Modifier - .fillMaxSize() - .windowInsetsPadding(WindowInsets.systemBars.only(WindowInsetsSides.Bottom)) + RoundedCornerColumn( + modifier = Modifier.fillMaxWidth().padding(10.dp), + backgroundColor = MaterialTheme.colorScheme.containerBackground ) { - Column( - modifier = modifier.fillMaxSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Top + RoundedCornerColumnTextItemWithExtraOnRight( + verticalPadding = 15.dp, + titleText = stringResource(R.string.enable_notification_title), + subTitleText = stringResource(R.string.enable_service_notification_sub), + primaryColor = MaterialTheme.colorScheme.title, + secondaryColor = MaterialTheme.colorScheme.subTitle, + hasBottomDivider = true ) { - Text( - modifier = Modifier.fillMaxWidth().wrapContentHeight(), - text = stringResource(R.string.pref_notification_title), - color = MaterialTheme.colorScheme.title, - fontWeight = FontWeight.SemiBold, - fontSize = 14.sp, - textAlign = TextAlign.Start - ) - - HorizontalDivider( - Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.subTitle - ) - - Column( - modifier = Modifier.wrapContentHeight() - .padding(top = 15.dp, bottom = 15.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Top - ) { - Row( - verticalAlignment = Alignment.CenterVertically - ) { - Column( - modifier = Modifier.wrapContentHeight().weight(5f), - verticalArrangement = Arrangement.spacedBy(5.dp) - ) { - Text( - modifier = Modifier.fillMaxWidth().wrapContentHeight(), - text = stringResource(R.string.enable_notification_title), - color = MaterialTheme.colorScheme.title, - fontWeight = FontWeight.Medium, - fontSize = 18.sp, - textAlign = TextAlign.Start - ) - - Text( - modifier = Modifier.fillMaxWidth().wrapContentHeight(), - text = stringResource(R.string.enable_service_notification_sub), - color = MaterialTheme.colorScheme.subTitle, - fontWeight = FontWeight.Normal, - fontSize = 12.sp, - textAlign = TextAlign.Start + Switch( + checked = uiStatus.isMainNotificationPermissionGranted, + colors = SwitchDefaults.colors().copy( + checkedTrackColor = MaterialTheme.colorScheme.buttonPurple, + checkedThumbColor = Color.White + ), + onCheckedChange = { + val settingIntent = Intent( + "android.settings.APP_NOTIFICATION_SETTINGS" + ).apply { + this.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + this.putExtra( + "android.provider.extra.APP_PACKAGE", + context.packageName ) } + context.startActivity(settingIntent) + }, + enabled = uiStatus.isSyncCompleted + ) + } - Switch( - checked = uiStatus.isMainNotificationPermissionGranted, - colors = SwitchDefaults.colors().copy( - checkedTrackColor = MaterialTheme.colorScheme.buttonPurple, - checkedThumbColor = Color.White - ), - onCheckedChange = { - val settingIntent = Intent( - "android.settings.APP_NOTIFICATION_SETTINGS" - ).apply { - this.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - this.putExtra( - "android.provider.extra.APP_PACKAGE", - context.packageName - ) - } - context.startActivity(settingIntent) - }, - enabled = uiStatus.isSyncCompleted - ) - } - } - - LabeledToggleSwitch( - modifier = Modifier.padding(start = 10.dp), - titleText = stringResource(R.string.general_notificaiton_channel_name), - subTitleText = stringResource(R.string.general_notification_channel_description), - isChecked = uiStatus.isEachChannelAllowed[0], - isEnabled = uiStatus.isMainNotificationPermissionGranted && uiStatus.isSyncCompleted - ) { - viewModel.updateChannelPreferenceState(0, it) - } + RoundedCornerColumnTextItemWithExtraOnRight( + modifier = Modifier.padding(start = 10.dp), + verticalPadding = 15.dp, + titleText = stringResource(R.string.general_notificaiton_channel_name), + subTitleText = stringResource(R.string.general_notification_channel_description), + primaryColor = MaterialTheme.colorScheme.title, + secondaryColor = MaterialTheme.colorScheme.subTitle, + hasBottomDivider = true + ) { + Switch( + checked = uiStatus.isEachChannelAllowed[0], + colors = SwitchDefaults.colors().copy( + checkedTrackColor = MaterialTheme.colorScheme.buttonPurple, + checkedThumbColor = Color.White + ), + onCheckedChange = { + viewModel.updateChannelPreferenceState(0, it) + }, + enabled = uiStatus.isMainNotificationPermissionGranted && uiStatus.isSyncCompleted + ) + } - LabeledToggleSwitch( - modifier = Modifier.padding(start = 10.dp), - titleText = stringResource(R.string.academic_notification_channel_name), - subTitleText = stringResource(R.string.academic_notification_channel_description), - isChecked = uiStatus.isEachChannelAllowed[1], - isEnabled = uiStatus.isMainNotificationPermissionGranted && uiStatus.isSyncCompleted - ) { - viewModel.updateChannelPreferenceState(1, it) - } + RoundedCornerColumnTextItemWithExtraOnRight( + modifier = Modifier.padding(start = 10.dp), + verticalPadding = 15.dp, + titleText = stringResource(R.string.academic_notification_channel_name), + subTitleText = stringResource(R.string.academic_notification_channel_description), + primaryColor = MaterialTheme.colorScheme.title, + secondaryColor = MaterialTheme.colorScheme.subTitle, + hasBottomDivider = true + ) { + Switch( + checked = uiStatus.isEachChannelAllowed[1], + colors = SwitchDefaults.colors().copy( + checkedTrackColor = MaterialTheme.colorScheme.buttonPurple, + checkedThumbColor = Color.White + ), + onCheckedChange = { + viewModel.updateChannelPreferenceState(1, it) + }, + enabled = uiStatus.isMainNotificationPermissionGranted && uiStatus.isSyncCompleted + ) + } - LabeledToggleSwitch( - modifier = Modifier.padding(start = 10.dp), - titleText = stringResource(R.string.scholarship_notification_channel_name), - subTitleText = stringResource(R.string.scholarship_notification_channel_description), - isChecked = uiStatus.isEachChannelAllowed[2], - isEnabled = uiStatus.isMainNotificationPermissionGranted && uiStatus.isSyncCompleted - ) { - viewModel.updateChannelPreferenceState(2, it) - } + RoundedCornerColumnTextItemWithExtraOnRight( + modifier = Modifier.padding(start = 10.dp), + verticalPadding = 15.dp, + titleText = stringResource(R.string.scholarship_notification_channel_name), + subTitleText = stringResource(R.string.scholarship_notification_channel_description), + primaryColor = MaterialTheme.colorScheme.title, + secondaryColor = MaterialTheme.colorScheme.subTitle, + hasBottomDivider = true + ) { + Switch( + checked = uiStatus.isEachChannelAllowed[2], + colors = SwitchDefaults.colors().copy( + checkedTrackColor = MaterialTheme.colorScheme.buttonPurple, + checkedThumbColor = Color.White + ), + onCheckedChange = { + viewModel.updateChannelPreferenceState(2, it) + }, + enabled = uiStatus.isMainNotificationPermissionGranted && uiStatus.isSyncCompleted + ) + } - LabeledToggleSwitch( - modifier = Modifier.padding(start = 10.dp), - titleText = stringResource(R.string.event_notification_channel_name), - subTitleText = stringResource(R.string.event_notification_channel_description), - isChecked = uiStatus.isEachChannelAllowed[3], - isEnabled = uiStatus.isMainNotificationPermissionGranted && uiStatus.isSyncCompleted - ) { - viewModel.updateChannelPreferenceState(3, it) - } + RoundedCornerColumnTextItemWithExtraOnRight( + modifier = Modifier.padding(start = 10.dp), + verticalPadding = 15.dp, + titleText = stringResource(R.string.event_notification_channel_name), + subTitleText = stringResource(R.string.event_notification_channel_description), + primaryColor = MaterialTheme.colorScheme.title, + secondaryColor = MaterialTheme.colorScheme.subTitle, + hasBottomDivider = false + ) { + Switch( + checked = uiStatus.isEachChannelAllowed[3], + colors = SwitchDefaults.colors().copy( + checkedTrackColor = MaterialTheme.colorScheme.buttonPurple, + checkedThumbColor = Color.White + ), + onCheckedChange = { + viewModel.updateChannelPreferenceState(3, it) + }, + enabled = uiStatus.isMainNotificationPermissionGranted && uiStatus.isSyncCompleted + ) } + } - if (!uiStatus.isSyncCompleted) { - Box( - modifier = Modifier.matchParentSize() + if (!uiStatus.isSyncCompleted) { + Box( + modifier = Modifier.fillMaxSize() + .background(Color.Transparent) + ) { + Surface( + modifier = Modifier.align(Alignment.Center) .background(Color.Transparent) + .clip(RoundedCornerShape(20.dp)), + color = MaterialTheme.colorScheme.containerBackground ) { - Surface( + CircularProgressIndicator( modifier = Modifier.align(Alignment.Center) - .background(Color.Transparent) - .clip(RoundedCornerShape(20.dp)), - color = MaterialTheme.colorScheme.containerBackground - ) { - CircularProgressIndicator( - modifier = Modifier.align(Alignment.Center) - .padding(25.dp), - color = MaterialTheme.colorScheme.textPurple - ) - } + .padding(25.dp), + color = MaterialTheme.colorScheme.textPurple + ) } } } diff --git a/feature/main/src/main/java/com/doyoonkim/main/preference/UserPreferencesScreen.kt b/feature/main/src/main/java/com/doyoonkim/main/preference/UserPreferencesScreen.kt index b74e8cce..5b185e31 100644 --- a/feature/main/src/main/java/com/doyoonkim/main/preference/UserPreferencesScreen.kt +++ b/feature/main/src/main/java/com/doyoonkim/main/preference/UserPreferencesScreen.kt @@ -1,38 +1,26 @@ package com.doyoonkim.main.preference import androidx.activity.compose.BackHandler -import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.WindowInsets -import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBars -import androidx.compose.foundation.layout.windowInsetsPadding -import androidx.compose.foundation.layout.wrapContentHeight -import androidx.compose.foundation.layout.wrapContentSize -import androidx.compose.material3.HorizontalDivider -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import com.doyoonkim.common.R import com.doyoonkim.common.theme.buttonContainer +import com.doyoonkim.common.theme.containerBackground import com.doyoonkim.common.theme.subTitle import com.doyoonkim.common.theme.title +import com.doyoonkim.common.ui.CircleGoButton +import com.doyoonkim.common.ui.RoundedCornerColumn +import com.doyoonkim.common.ui.RoundedCornerColumnTextItem +import com.doyoonkim.common.ui.RoundedCornerColumnTextItemWithExtraOnRight @Composable fun UserPreferenceScreen( @@ -45,177 +33,79 @@ fun UserPreferenceScreen( BackHandler { onBackPressed() } Column( - modifier = modifier - .windowInsetsPadding(WindowInsets.systemBars.only(WindowInsetsSides.Bottom)), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Top + modifier = modifier.fillMaxWidth() + .padding(10.dp), + verticalArrangement = Arrangement.spacedBy(30.dp), + horizontalAlignment = Alignment.CenterHorizontally ) { - Text( - modifier = Modifier.fillMaxWidth().wrapContentHeight() - .padding(bottom = 2.dp), - text = stringResource(R.string.pref_notification_title), - fontWeight = FontWeight.SemiBold, - fontSize = 14.sp, - textAlign = TextAlign.Start, - color = MaterialTheme.colorScheme.title - ) - - HorizontalDivider( - Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.subTitle - ) - - Column( - modifier = Modifier.fillMaxWidth().wrapContentSize(), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.Center + RoundedCornerColumn( + backgroundColor = MaterialTheme.colorScheme.containerBackground ) { - Row( - verticalAlignment = Alignment.CenterVertically + RoundedCornerColumnTextItemWithExtraOnRight( + verticalPadding = 10.dp, + titleText = stringResource(R.string.enable_notification_title), + subTitleText = null, + primaryColor = MaterialTheme.colorScheme.title, + secondaryColor = MaterialTheme.colorScheme.subTitle, + hasBottomDivider = false ) { - Text( - modifier = Modifier.wrapContentHeight().weight(5f), - text = stringResource(R.string.enable_notification_title), - fontWeight = FontWeight.Medium, - fontSize = 18.sp, - textAlign = TextAlign.Start, - color = MaterialTheme.colorScheme.title + CircleGoButton( + modifier = Modifier.weight(1f), + containerColor = MaterialTheme.colorScheme.buttonContainer, + contentColor = MaterialTheme.colorScheme.subTitle, + onClick = onNotificationPreferenceClicked ) - - IconButton( - onClick = { onNotificationPreferenceClicked() } - ) { - Image( - painter = painterResource(R.drawable.baseline_arrow_forward_ios_24), - contentDescription = "Go to App Notification Preferences page.", - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.buttonContainer) - ) - } } } - HorizontalDivider( - Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.subTitle - ) - - Text( - modifier = Modifier.fillMaxWidth().wrapContentHeight() - .padding(top = 20.dp, bottom = 2.dp), - text = stringResource(R.string.title_support), - fontWeight = FontWeight.SemiBold, - fontSize = 14.sp, - textAlign = TextAlign.Start, - color = MaterialTheme.colorScheme.title - ) - - HorizontalDivider( - Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.subTitle - ) - - Row( - modifier = Modifier.fillMaxWidth().wrapContentSize(), - verticalAlignment = Alignment.CenterVertically, + RoundedCornerColumn( + backgroundColor = MaterialTheme.colorScheme.containerBackground ) { - Text( - modifier = Modifier.wrapContentHeight().weight(5f), - text = stringResource(R.string.title_customer_service), - fontWeight = FontWeight.Medium, - fontSize = 18.sp, - textAlign = TextAlign.Start, - color = MaterialTheme.colorScheme.title - ) - - IconButton( - onClick = { onCustomerServiceClicked() } + RoundedCornerColumnTextItemWithExtraOnRight( + verticalPadding = 10.dp, + titleText = stringResource(R.string.title_support), + subTitleText = null, + primaryColor = MaterialTheme.colorScheme.title, + secondaryColor = MaterialTheme.colorScheme.subTitle, + hasBottomDivider = false ) { - Image( - painter = painterResource(R.drawable.baseline_arrow_forward_ios_24), - contentDescription = "Go to customer service page.", - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.buttonContainer) + CircleGoButton( + modifier = Modifier.weight(1f), + containerColor = MaterialTheme.colorScheme.buttonContainer, + contentColor = MaterialTheme.colorScheme.subTitle, + onClick = onCustomerServiceClicked ) } } - HorizontalDivider( - Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.subTitle - ) - - Text( - modifier = Modifier.fillMaxWidth().wrapContentHeight() - .padding(top = 20.dp, bottom = 2.dp), - text = stringResource(R.string.about_title), - fontWeight = FontWeight.SemiBold, - fontSize = 14.sp, - textAlign = TextAlign.Start, - color = MaterialTheme.colorScheme.title - ) - - HorizontalDivider( - Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.subTitle - ) - - Row( - modifier = Modifier.fillMaxWidth().wrapContentSize() - .padding(top = 12.5.dp, bottom = 12.5.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Text( - modifier = Modifier.wrapContentHeight().weight(3f), - text = stringResource(R.string.about_version), - fontWeight = FontWeight.Medium, - fontSize = 18.sp, - textAlign = TextAlign.Start, - color = MaterialTheme.colorScheme.title - ) - - Text( - modifier = Modifier.wrapContentHeight().weight(3f), - text = stringResource(R.string.version_code), - fontWeight = FontWeight.Normal, - fontSize = 16.sp, - textAlign = TextAlign.End, - color = MaterialTheme.colorScheme.title - ) - } - - HorizontalDivider( - Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.subTitle - ) - - Row( - modifier = Modifier.fillMaxWidth().wrapContentSize(), - verticalAlignment = Alignment.CenterVertically, + RoundedCornerColumn( + backgroundColor = MaterialTheme.colorScheme.containerBackground ) { - Text( - modifier = Modifier.wrapContentHeight().weight(5f), - text = stringResource(R.string.about_oss), - fontWeight = FontWeight.Medium, - fontSize = 18.sp, - textAlign = TextAlign.Start, - color = MaterialTheme.colorScheme.title + RoundedCornerColumnTextItem( + verticalPadding = 12.dp, + titleText = stringResource(R.string.about_version), + subTitleText = stringResource(R.string.version_code), + primaryColor = MaterialTheme.colorScheme.title, + secondaryColor = MaterialTheme.colorScheme.subTitle, + hasBottomDivider = true ) - IconButton( - onClick = { onOssClicked() } + RoundedCornerColumnTextItemWithExtraOnRight( + verticalPadding = 10.dp, + titleText = stringResource(R.string.about_oss), + subTitleText = null, + primaryColor = MaterialTheme.colorScheme.title, + secondaryColor = MaterialTheme.colorScheme.subTitle, + hasBottomDivider = false ) { - Image( - painter = painterResource(R.drawable.baseline_arrow_forward_ios_24), - contentDescription = "Button to OSS Notice", - colorFilter = ColorFilter.tint(MaterialTheme.colorScheme.buttonContainer) + CircleGoButton( + modifier = Modifier.weight(1f), + containerColor = MaterialTheme.colorScheme.buttonContainer, + contentColor = MaterialTheme.colorScheme.subTitle, + onClick = onOssClicked ) } } - - HorizontalDivider( - Modifier.fillMaxWidth(), - color = MaterialTheme.colorScheme.subTitle - ) - } }