Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,15 @@ fun createAlarmDismissIntent(
fun createNavigateToMissionPendingIntent(
applicationContext: Context,
notificationId: Long,
missionType: Int,
missionCount: Int,
): PendingIntent {
val navigateToMissionIntent = createNavigateToMissionIntent(applicationContext, notificationId)
val navigateToMissionIntent = createNavigateToMissionIntent(
context = applicationContext,
notificationId = notificationId,
missionType = missionType,
missionCount = missionCount,
)
return PendingIntent.getActivity(
applicationContext,
notificationId.toInt(),
Expand All @@ -48,8 +55,11 @@ fun createNavigateToMissionPendingIntent(
fun createNavigateToMissionIntent(
context: Context,
notificationId: Long,
missionType: Int,
missionCount: Int,
): Intent {
return Intent(Intent.ACTION_VIEW, "orbitapp://mission?notificationId=$notificationId".toUri()).apply {
val uriString = "orbitapp://mission?notificationId=$notificationId&missionType=$missionType&missionCount=$missionCount"
return Intent(Intent.ACTION_VIEW, uriString.toUri()).apply {
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
setPackage(context.packageName)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,8 @@ class AlarmService : Service() {
createNavigateToMissionPendingIntent(
applicationContext = applicationContext,
notificationId = alarm.id,
missionType = alarm.missionType.value,
missionCount = alarm.missionCount,
)
} else {
createAlarmDismissPendingIntent(
Expand Down
16 changes: 16 additions & 0 deletions core/designsystem/src/main/res/drawable/ic_delete.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="21dp"
android:height="21dp"
android:viewportWidth="21"
android:viewportHeight="21">
<path
android:pathData="M9.917,10.232V14.398C9.917,14.815 9.583,15.232 9.083,15.232C8.583,15.232 8.25,14.815 8.25,14.398V10.232C8.25,9.732 8.667,9.398 9.083,9.398C9.5,9.398 9.917,9.732 9.917,10.232Z"
android:fillColor="#7B8696"/>
<path
android:pathData="M12.751,10.232V14.398C12.751,14.815 12.334,15.232 11.917,15.232C11.501,15.232 11.084,14.815 11.084,14.398V10.232C11.084,9.732 11.417,9.398 11.917,9.398C12.417,9.398 12.751,9.732 12.751,10.232Z"
android:fillColor="#7B8696"/>
<path
android:pathData="M16.751,5.898H14.084V5.314C14.084,4.731 13.834,4.148 13.417,3.731C13.001,3.314 12.417,3.064 11.834,3.064H9.084C8.501,3.064 7.917,3.314 7.501,3.731C7.084,4.148 6.834,4.731 6.834,5.314V5.898H4.167C3.751,5.898 3.334,6.314 3.334,6.731C3.334,7.148 3.751,7.564 4.167,7.564H4.751V16.481C4.751,17.065 5.001,17.648 5.417,18.065C5.834,18.481 6.417,18.731 7.001,18.731H13.917C14.501,18.731 15.084,18.481 15.501,18.065C15.917,17.648 16.167,17.065 16.167,16.481V7.564H16.751C17.167,7.564 17.584,7.231 17.584,6.731C17.584,6.231 17.167,5.898 16.751,5.898ZM8.584,5.314C8.584,5.148 8.584,5.064 8.751,4.898C8.834,4.814 9.001,4.731 9.167,4.731H11.917C12.084,4.731 12.167,4.731 12.334,4.898C12.417,4.981 12.501,5.148 12.501,5.314V5.898H8.584V5.314ZM14.501,16.481C14.501,16.648 14.501,16.731 14.334,16.898C14.167,17.065 14.084,17.065 13.917,17.065H7.001C6.834,17.065 6.751,17.065 6.584,16.898C6.417,16.731 6.417,16.648 6.417,16.481V7.564H14.501V16.481Z"
android:fillColor="#7B8696"
android:fillType="evenOdd"/>
</vector>
18 changes: 18 additions & 0 deletions core/designsystem/src/main/res/drawable/ic_mission_shake.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="29dp"
android:height="29dp"
android:viewportWidth="29"
android:viewportHeight="29">
<path
android:pathData="M7.611,0.898L21.389,0.898A7.111,7.111 0,0 1,28.5 8.01L28.5,21.787A7.111,7.111 0,0 1,21.389 28.898L7.611,28.898A7.111,7.111 0,0 1,0.5 21.787L0.5,8.01A7.111,7.111 0,0 1,7.611 0.898z"
android:fillColor="#51A0FE"/>
<path
android:pathData="M12.428,22.068L8.392,19.369L7.978,17.321L12.816,7.977L15.147,7.591L20.124,10.281L20.743,12.472L15.418,21.918L12.428,22.068ZM19.135,12.203L18.396,11.051L15.142,9.485L13.81,9.485L11.879,13.361L14.334,14.794L17.027,15.823L19.135,12.203Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M8.978,9.924L9.718,11.379L8.477,13.313L7.26,15.627L6.568,14.219L8.978,9.924Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M22.367,14.949L19.68,19.73L18.152,19.73L20.807,14.949L22.367,14.949Z"
android:fillColor="#ffffff"/>
</vector>
27 changes: 27 additions & 0 deletions core/designsystem/src/main/res/drawable/ic_mission_tap.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="27dp"
android:height="27dp"
android:viewportWidth="27"
android:viewportHeight="27">
<path
android:pathData="M7.611,0.898L19.389,0.898A7.111,7.111 0,0 1,26.5 8.01L26.5,19.787A7.111,7.111 0,0 1,19.389 26.898L7.611,26.898A7.111,7.111 0,0 1,0.5 19.787L0.5,8.01A7.111,7.111 0,0 1,7.611 0.898z"
android:fillColor="#B671FF"/>
<path
android:pathData="M16.77,12.077H19.446L19.635,13.17H16.77L16.861,12.606L16.77,12.077Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M18.202,9.051L17.647,8.262L17.274,8.367L15.622,10.161C15.837,10.382 16.285,10.842 16.357,10.914C16.428,10.986 17.617,9.702 18.202,9.051Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M14.395,6.898C14.065,6.904 13.387,6.911 13.311,6.898V9.784L14.395,9.72V6.898Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M9.453,9.051L10.027,8.317L12.195,10.134L11.462,10.915L9.453,9.051Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M10.839,12.064L8.113,12.159V13.275H10.839L10.746,12.644L10.839,12.064Z"
android:fillColor="#ffffff"/>
<path
android:pathData="M12.534,13.269V18.294L11.535,17.004L10.636,16.592L9.695,16.79C9.547,17.12 9.24,17.823 9.2,17.994C9.161,18.166 10.218,20.189 10.752,21.179H19.159L19.321,18.621L18.404,17.663L17.649,17.004H15.52L15.388,13.269L14.761,11.982H13.276L12.534,13.269Z"
android:fillColor="#ffffff"/>
</vector>
1 change: 1 addition & 0 deletions core/designsystem/src/main/res/raw/mission_shake.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions core/designsystem/src/main/res/raw/mission_tap.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ fun OrbitButton(
modifier: Modifier = Modifier,
onClick: () -> Unit,
enabled: Boolean = false,
useFillMaxWidth: Boolean = true,
debounceTime: Long = 500L,
height: Dp = 54.dp,
containerColor: Color = OrbitTheme.colors.main,
Expand Down Expand Up @@ -77,7 +78,9 @@ fun OrbitButton(
),
interactionSource = interactionSource,
modifier = modifier
.fillMaxWidth()
.then(
if (useFillMaxWidth) Modifier.fillMaxWidth() else Modifier,
)
.padding(padding)
.height(height - padding * 2),
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ sealed class AlarmAddEditContract {

data class AlarmMissionState(
val missionType: MissionType = MissionType.TAP,
val missionCount: Int = 10,
)

data class AlarmSnoozeState(
Expand Down Expand Up @@ -83,6 +84,7 @@ sealed class AlarmAddEditContract {
data class ToggleSpecificDaySelection(val day: AlarmDay) : Action()
data object ToggleHolidaySkipOption : Action()
data object ToggleSnoozeOption : Action()
data class SaveMission(val type: MissionType, val count: Int) : Action()
data class SetSnoozeInterval(val index: Int) : Action()
data class SetSnoozeRepeatCount(val index: Int) : Action()
data object ToggleVibrationOption : Action()
Expand All @@ -93,6 +95,7 @@ sealed class AlarmAddEditContract {
}

sealed class BottomSheetType {
data object MissionSetting : BottomSheetType()
data object SnoozeSetting : BottomSheetType()
data object SoundSetting : BottomSheetType()
}
Expand Down Expand Up @@ -125,6 +128,8 @@ internal fun AlarmAddEditContract.State.toAlarm(id: Long = 0): Alarm {
minute = timeState.currentTime.minute,
repeatDays = daySelectionState.selectedDays.toRepeatDays(),
isHolidayAlarmOff = holidayState.isDisableHolidayChecked,
missionType = missionState.missionType,
missionCount = missionState.missionCount,
isSnoozeEnabled = snoozeState.isSnoozeEnabled,
snoozeInterval = snoozeState.snoozeIntervals.getOrNull(snoozeState.snoozeIntervalIndex)
?.filter { it.isDigit() }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import com.yapp.home.DELETE_ALARM_RESULT_KEY
import com.yapp.home.UPDATE_ALARM_RESULT_KEY
import com.yapp.home.alarm.component.AlarmCheckItem
import com.yapp.home.alarm.component.AlarmDayButton
import com.yapp.home.alarm.component.bottomsheet.AlarmMissionBottomSheet
import com.yapp.home.alarm.component.bottomsheet.AlarmSnoozeBottomSheet
import com.yapp.home.alarm.component.bottomsheet.AlarmSoundBottomSheet
import com.yapp.home.alarm.getLabelStringRes
Expand Down Expand Up @@ -167,7 +168,9 @@ fun AlarmAddEditContent(
eventDispatcher(AlarmAddEditContract.Action.CheckUnsavedChangesBeforeExit)
}

val missionState = state.missionState
val snoozeState = state.snoozeState
val missionBottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
val snoozeBottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
val soundBottomSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true)
val scope = rememberCoroutineScope()
Expand Down Expand Up @@ -218,6 +221,30 @@ fun AlarmAddEditContent(
)
}

AlarmMissionBottomSheet(
sheetState = missionBottomSheetState,
missionType = missionState.missionType,
missionCount = missionState.missionCount,
isSheetOpen = state.bottomSheetState == AlarmAddEditContract.BottomSheetType.MissionSetting,
onDismiss = {
scope.launch {
missionBottomSheetState.hide()
}.invokeOnCompletion {
eventDispatcher(AlarmAddEditContract.Action.ToggleBottomSheet(AlarmAddEditContract.BottomSheetType.MissionSetting))
}
},
onSaveMission = { missionType, missionCount ->
eventDispatcher(
AlarmAddEditContract.Action.SaveMission(
type = missionType,
count = missionCount,
),
)
},
onPreviewMission = {
},
)

AlarmSnoozeBottomSheet(
snoozeEnabled = snoozeState.isSnoozeEnabled,
snoozeIntervalIndex = snoozeState.snoozeIntervalIndex,
Expand Down Expand Up @@ -419,11 +446,33 @@ private fun AlarmAddEditSettingsSection(
AlarmAddEditSettingItem(
label = stringResource(id = R.string.alarm_add_edit_mission),
description = when (state.missionState.missionType) {
MissionType.TAP -> stringResource(id = R.string.alarm_add_edit_selected_mission_tap)
MissionType.SHAKE -> stringResource(id = R.string.alarm_add_edit_selected_mission_shake)
MissionType.TAP -> {
val missionType = stringResource(id = R.string.alarm_add_edit_selected_mission_tap)
val missionCount = state.missionState.missionCount
stringResource(
id = R.string.alarm_add_edit_selected_mission_with_count,
missionType,
missionCount,
)
}
MissionType.SHAKE -> {
val missionType = stringResource(id = R.string.alarm_add_edit_selected_mission_shake)
val missionCount = state.missionState.missionCount
stringResource(
id = R.string.alarm_add_edit_selected_mission_with_count,
missionType,
missionCount,
)
}
else -> stringResource(id = R.string.alarm_add_edit_selected_mission_none)
},
onClick = { },
onClick = {
processAction(
AlarmAddEditContract.Action.ToggleBottomSheet(
AlarmAddEditContract.BottomSheetType.MissionSetting,
),
)
},
)
Spacer(
modifier = Modifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.yapp.common.util.ResourceProvider
import com.yapp.domain.model.Alarm
import com.yapp.domain.model.AlarmDay
import com.yapp.domain.model.AlarmSound
import com.yapp.domain.model.MissionType
import com.yapp.domain.model.copyFrom
import com.yapp.domain.model.toAlarmDayNames
import com.yapp.domain.model.toAlarmDays
Expand Down Expand Up @@ -107,6 +108,7 @@ class AlarmAddEditViewModel @Inject constructor(
isDisableHolidayEnabled = repeatDays.isNotEmpty(),
isDisableHolidayChecked = alarm.isHolidayAlarmOff,
),
missionState = setUpMissionState(alarm, state),
snoozeState = setupSnoozeState(alarm, state),
soundState = state.soundState.copy(
isVibrationEnabled = alarm.isVibrationEnabled,
Expand All @@ -131,6 +133,16 @@ class AlarmAddEditViewModel @Inject constructor(
)
}

private fun setUpMissionState(
alarm: Alarm,
currentState: AlarmAddEditContract.State,
): AlarmAddEditContract.AlarmMissionState {
return currentState.missionState.copy(
missionType = alarm.missionType,
missionCount = alarm.missionCount,
)
}

private fun setupSnoozeState(
alarm: Alarm,
currentState: AlarmAddEditContract.State,
Expand Down Expand Up @@ -168,6 +180,7 @@ class AlarmAddEditViewModel @Inject constructor(
is AlarmAddEditContract.Action.ToggleWeekendsSelection -> toggleWeekendsSelection()
is AlarmAddEditContract.Action.ToggleSpecificDaySelection -> toggleSpecificDaySelection(action.day)
is AlarmAddEditContract.Action.ToggleHolidaySkipOption -> toggleHolidaySkipOption()
is AlarmAddEditContract.Action.SaveMission -> saveMission(action.type, action.count)
is AlarmAddEditContract.Action.ToggleSnoozeOption -> toggleSnoozeOption()
is AlarmAddEditContract.Action.SetSnoozeInterval -> setSnoozeInterval(action.index)
is AlarmAddEditContract.Action.SetSnoozeRepeatCount -> setSnoozeRepeatCount(action.index)
Expand Down Expand Up @@ -424,6 +437,16 @@ class AlarmAddEditViewModel @Inject constructor(
}
}

private fun saveMission(type: MissionType, count: Int) = intent {
val newMissionState = state.missionState.copy(
missionType = type,
missionCount = count,
)
reduce {
state.copy(missionState = newMissionState)
}
}

private fun toggleSnoozeOption() = intent {
val newSnoozeState = state.snoozeState.copy(
isSnoozeEnabled = !state.snoozeState.isSnoozeEnabled,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,6 @@ private fun Int.toRepeatDaysString(isAm: Boolean, hour: Int, minute: Int): Strin
days.size == 7 -> "매일"
days.isNotEmpty() -> "매주 " + days.joinToString(", ") { it.toKoreanString() }
else -> getNextAlarmDateWithTime(
isAm = isAm,
hour = hour,
minute = minute,
)
Expand All @@ -315,16 +314,10 @@ private fun AlarmDay.toKoreanString(): String {
}
}

private fun getNextAlarmDateWithTime(isAm: Boolean, hour: Int, minute: Int): String {
private fun getNextAlarmDateWithTime(hour: Int, minute: Int): String {
val now = LocalDateTime.now()

val alarmHour = if (isAm) {
if (hour == 12) 0 else hour
} else {
if (hour == 12) 12 else hour + 12
}

val alarmTime = LocalTime.of(alarmHour, minute)
val alarmTime = LocalTime.of(hour, minute)
val todayAlarm = LocalDateTime.of(now.toLocalDate(), alarmTime)

// 오늘 시간 이미 지났으면 내일로 설정
Expand Down
Loading