Skip to content

Commit 51deb32

Browse files
authored
Merge pull request #189 from YAPP-Github/feat/#188-alarm-list-sorting
[FEAT] μ•ŒλžŒ μ•„μ΄ν…œ μ •λ ¬ κΈ°λŠ₯을 κ΅¬ν˜„ν•©λ‹ˆλ‹€.
2 parents fe2095c + a13de45 commit 51deb32

File tree

11 files changed

+302
-21
lines changed

11 files changed

+302
-21
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="14dp"
3+
android:height="10dp"
4+
android:viewportWidth="14"
5+
android:viewportHeight="10">
6+
<path
7+
android:pathData="M13.145,0.244C13.47,0.57 13.47,1.097 13.145,1.423L5.506,9.061C5.35,9.218 5.138,9.306 4.917,9.306C4.696,9.306 4.484,9.218 4.328,9.061L0.855,5.589C0.53,5.264 0.53,4.736 0.855,4.411C1.181,4.085 1.708,4.085 2.034,4.411L4.917,7.294L11.967,0.244C12.292,-0.081 12.82,-0.081 13.145,0.244Z"
8+
android:fillColor="#17191F"/>
9+
</vector>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<vector xmlns:android="http://schemas.android.com/apk/res/android"
2+
android:width="14dp"
3+
android:height="14dp"
4+
android:viewportWidth="14"
5+
android:viewportHeight="14">
6+
<path
7+
android:pathData="M11.75,0.584C8.546,0.249 5.47,0.249 2.266,0.584C0.656,0.752 -0.455,2.432 0.363,3.956C1.355,5.803 2.759,7.531 4.714,8.86V12.12C4.714,13.232 5.854,13.98 6.874,13.537L8.373,12.886C8.937,12.641 9.303,12.085 9.303,11.469V8.86C11.257,7.531 12.661,5.803 13.653,3.956C14.062,3.193 13.95,2.374 13.564,1.748C13.184,1.131 12.518,0.664 11.75,0.584Z"
8+
android:fillColor="#ffffff"
9+
android:fillType="evenOdd"/>
10+
</vector>

β€Žcore/ui/src/main/java/com/yapp/ui/component/checkbox/OrbitCheckBox.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ fun OrbitCheckBox(
4242
contentAlignment = Alignment.Center,
4343
) {
4444
Icon(
45-
painter = painterResource(core.designsystem.R.drawable.ic_check),
45+
painter = painterResource(core.designsystem.R.drawable.ic_check_border_lined),
4646
contentDescription = "IC_CHECK",
4747
tint = OrbitTheme.colors.gray_700,
4848
)

β€Žfeature/home/src/main/java/com/yapp/alarm/component/AlarmListItem.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -116,12 +116,13 @@ internal fun AlarmListItem(
116116
) {
117117
SwipeToDismissBox(
118118
state = dismissState,
119+
modifier = modifier,
119120
enableDismissFromStartToEnd = false,
120121
enableDismissFromEndToStart = swipeable,
121122
gesturesEnabled = swipeable,
122123
backgroundContent = {
123124
Box(
124-
modifier = modifier
125+
modifier = Modifier
125126
.fillMaxSize()
126127
.background(OrbitTheme.colors.gray_500)
127128
.onGloballyPositioned {
@@ -152,7 +153,7 @@ internal fun AlarmListItem(
152153
},
153154
) {
154155
Row(
155-
modifier = modifier
156+
modifier = Modifier
156157
.fillMaxWidth()
157158
.background(
158159
if (selected) OrbitTheme.colors.gray_800 else OrbitTheme.colors.gray_900,

β€Žfeature/home/src/main/java/com/yapp/home/HomeContract.kt

+18-1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ sealed class HomeContract {
1212
val alarms: List<Alarm> = emptyList(),
1313
val lastAddedAlarmIndex: Int? = null,
1414
val dropdownMenuExpanded: Boolean = false,
15+
val sortDropDownMenuExpanded: Boolean = false,
1516
val selectedAlarmIds: Set<Long> = emptySet(),
1617
val isSelectionMode: Boolean = false,
1718
val isDeleteDialogVisible: Boolean = false,
@@ -25,17 +26,27 @@ sealed class HomeContract {
2526
val name: String = "",
2627
val activeItemMenu: Long? = null,
2728
val activeItemMenuPosition: Pair<Float, Float>? = null,
29+
val sortOrder: AlarmSortOrder = AlarmSortOrder.DEFAULT,
2830
) : UiState {
2931
val isAllSelected: Boolean
3032
get() = alarms.isNotEmpty() && selectedAlarmIds.size == alarms.size
33+
3134
val hasActivatedAlarm: Boolean
3235
get() = alarms.any { it.isAlarmActive }
36+
37+
val sortedAlarms: List<Alarm>
38+
get() = when (sortOrder) {
39+
AlarmSortOrder.DEFAULT -> alarms
40+
AlarmSortOrder.ACTIVATION -> alarms.sortedByDescending { it.isAlarmActive }
41+
}
3342
}
3443

3544
sealed class Action {
3645
data object NavigateToAlarmCreation : Action()
3746
data object ToggleMultiSelectionMode : Action()
38-
data object ToggleDropdownMenuVisibility : Action()
47+
data object ShowDropDownMenu : Action()
48+
data object ShowSortDropDownMenu : Action()
49+
data object HideDropDownMenu : Action()
3950
data class ToggleAlarmSelection(val alarmId: Long) : Action()
4051
data class ToggleAlarmActivation(val alarmId: Long) : Action()
4152
data class SwipeToDeleteAlarm(val id: Long) : Action()
@@ -57,6 +68,7 @@ sealed class HomeContract {
5768
data object NavigateToSetting : Action()
5869
data class ShowItemMenu(val alarmId: Long, val x: Float, val y: Float) : Action()
5970
data object HideItemMenu : Action()
71+
data class SetSortOrder(val sortOrder: AlarmSortOrder) : Action()
6072
}
6173

6274
sealed class SideEffect : com.yapp.ui.base.SideEffect {
@@ -76,4 +88,9 @@ sealed class HomeContract {
7688
val onAction: () -> Unit,
7789
) : SideEffect()
7890
}
91+
92+
enum class AlarmSortOrder {
93+
DEFAULT,
94+
ACTIVATION,
95+
}
7996
}

β€Žfeature/home/src/main/java/com/yapp/home/HomeScreen.kt

+24-10
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,10 @@ private fun HomeContent(
306306
},
307307
) {
308308
AlarmListBottomSheet(
309-
alarms = state.alarms,
309+
alarms = state.sortedAlarms,
310310
menuExpanded = state.dropdownMenuExpanded,
311+
sortDropDownMenuExpanded = state.sortDropDownMenuExpanded,
312+
sortOrder = state.sortOrder,
311313
isAllSelected = state.isAllSelected,
312314
isSelectionMode = state.isSelectionMode,
313315
selectedAlarmIds = state.selectedAlarmIds,
@@ -323,7 +325,11 @@ private fun HomeContent(
323325
eventDispatcher(HomeContract.Action.NavigateToAlarmCreation)
324326
},
325327
onClickMore = {
326-
eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility)
328+
if (state.dropdownMenuExpanded || state.sortDropDownMenuExpanded) {
329+
eventDispatcher(HomeContract.Action.HideDropDownMenu)
330+
} else {
331+
eventDispatcher(HomeContract.Action.ShowDropDownMenu)
332+
}
327333
},
328334
onClickCheckAll = {
329335
eventDispatcher(HomeContract.Action.ToggleAllAlarmSelection)
@@ -334,8 +340,14 @@ private fun HomeContent(
334340
onClickEdit = {
335341
eventDispatcher(HomeContract.Action.ToggleMultiSelectionMode)
336342
},
343+
onClickSort = {
344+
eventDispatcher(HomeContract.Action.ShowSortDropDownMenu)
345+
},
346+
onSetSortOrder = { sortOrder ->
347+
eventDispatcher(HomeContract.Action.SetSortOrder(sortOrder))
348+
},
337349
onDismissRequest = {
338-
eventDispatcher(HomeContract.Action.ToggleDropdownMenuVisibility)
350+
eventDispatcher(HomeContract.Action.HideDropDownMenu)
339351
},
340352
onToggleSelect = { alarmId ->
341353
eventDispatcher(HomeContract.Action.ToggleAlarmSelection(alarmId))
@@ -906,13 +918,15 @@ fun HomeScreenPreview() {
906918
OrbitTheme {
907919
HomeScreen(
908920
stateProvider = {
909-
HomeContract.State().copy(
910-
initialLoading = false,
911-
alarms = listOf(
912-
Alarm(),
913-
),
914-
activeItemMenu = 1,
915-
)
921+
HomeContract.State()
922+
.copy(
923+
initialLoading = false,
924+
alarms = listOf(
925+
Alarm(),
926+
),
927+
activeItemMenu = 0L,
928+
activeItemMenuPosition = Pair(0f, 0f),
929+
)
916930
},
917931
eventDispatcher = {},
918932
)

β€Žfeature/home/src/main/java/com/yapp/home/HomeViewModel.kt

+35-3
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ class HomeViewModel @Inject constructor(
4343
when (action) {
4444
HomeContract.Action.NavigateToAlarmCreation -> navigateToAlarmCreation()
4545
HomeContract.Action.ToggleMultiSelectionMode -> toggleMultiSelectionMode()
46-
HomeContract.Action.ToggleDropdownMenuVisibility -> toggleDropdownMenuVisibility()
46+
HomeContract.Action.ShowDropDownMenu -> showDropDownMenu()
47+
HomeContract.Action.ShowSortDropDownMenu -> showSortDropDownMenu()
48+
HomeContract.Action.HideDropDownMenu -> hideDropDownMenu()
4749
is HomeContract.Action.ToggleAlarmSelection -> toggleAlarmSelection(action.alarmId)
4850
HomeContract.Action.ToggleAllAlarmSelection -> toggleAllAlarmSelection()
4951
is HomeContract.Action.ToggleAlarmActivation -> toggleAlarmActivation(action.alarmId)
@@ -65,6 +67,7 @@ class HomeViewModel @Inject constructor(
6567
HomeContract.Action.NavigateToSetting -> navigateToSetting()
6668
is HomeContract.Action.ShowItemMenu -> showItemMenu(action.alarmId, action.x, action.y)
6769
HomeContract.Action.HideItemMenu -> hideItemMenu()
70+
is HomeContract.Action.SetSortOrder -> setSortOrder(action.sortOrder)
6871
}
6972
}
7073

@@ -113,8 +116,26 @@ class HomeViewModel @Inject constructor(
113116
}
114117
}
115118

116-
private fun toggleDropdownMenuVisibility() {
117-
updateState { copy(dropdownMenuExpanded = !currentState.dropdownMenuExpanded) }
119+
private fun showDropDownMenu() {
120+
updateState { copy(dropdownMenuExpanded = true) }
121+
}
122+
123+
private fun showSortDropDownMenu() {
124+
updateState {
125+
copy(
126+
dropdownMenuExpanded = false,
127+
sortDropDownMenuExpanded = true,
128+
)
129+
}
130+
}
131+
132+
private fun hideDropDownMenu() {
133+
updateState {
134+
copy(
135+
dropdownMenuExpanded = false,
136+
sortDropDownMenuExpanded = false,
137+
)
138+
}
118139
}
119140

120141
private fun toggleAlarmSelection(alarmId: Long) {
@@ -177,6 +198,12 @@ class HomeViewModel @Inject constructor(
177198

178199
private fun confirmDeletion() {
179200
deleteAlarms(currentState.selectedAlarmIds)
201+
updateState {
202+
copy(
203+
selectedAlarmIds = emptySet(),
204+
isDeleteDialogVisible = false,
205+
)
206+
}
180207
}
181208

182209
private fun showNoActivatedAlarmDialog() {
@@ -454,4 +481,9 @@ class HomeViewModel @Inject constructor(
454481
)
455482
}
456483
}
484+
485+
private fun setSortOrder(sortOrder: HomeContract.AlarmSortOrder) {
486+
updateState { copy(sortOrder = sortOrder) }
487+
hideDropDownMenu()
488+
}
457489
}

β€Žfeature/home/src/main/java/com/yapp/home/component/AlarmListDropDownMenu.kt

+10
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ internal fun AlarmListDropDownMenu(
4646
expanded: Boolean,
4747
onDismissRequest: () -> Unit,
4848
onClickEdit: () -> Unit,
49+
onClickSort: () -> Unit,
4950
) {
5051
DropdownMenu(
5152
modifier = modifier.padding(horizontal = 8.dp),
@@ -61,6 +62,12 @@ internal fun AlarmListDropDownMenu(
6162
) {
6263
onClickEdit()
6364
}
65+
AlarmListDropDownMenuItem(
66+
text = stringResource(id = R.string.alarm_list_bottom_sheet_menu_sort),
67+
iconRes = core.designsystem.R.drawable.ic_filter,
68+
) {
69+
onClickSort()
70+
}
6471
}
6572
}
6673

@@ -143,6 +150,9 @@ private fun AlarmListDropDownMenuPreview() {
143150
onClickEdit = {
144151
Log.d("AlarmListDropDownMenu", "Edit Clicked")
145152
},
153+
onClickSort = {
154+
Log.d("AlarmListDropDownMenu", "Sort Clicked")
155+
},
146156
)
147157
}
148158
}

0 commit comments

Comments
Β (0)