Skip to content

Commit

Permalink
feat: sorting order option for alarms (closes #168)
Browse files Browse the repository at this point in the history
  • Loading branch information
Bnyro committed Feb 8, 2025
1 parent b3d49a9 commit 96e924c
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 16 deletions.
10 changes: 10 additions & 0 deletions app/src/main/java/com/bnyro/clock/domain/model/AlarmSortOrder.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.bnyro.clock.domain.model

import androidx.annotation.StringRes
import com.bnyro.clock.R

enum class AlarmSortOrder(@StringRes val value: Int) {
HOUR_OF_DAY(R.string.hours),
LABEL(R.string.label),
WEEKDAY(R.string.weekdays)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.bnyro.clock.domain.model
import androidx.annotation.StringRes
import com.bnyro.clock.R

enum class SortOrder(@StringRes val value: Int) {
enum class TimeZoneSortOrder(@StringRes val value: Int) {
ALPHABETIC(R.string.alphabetic),
OFFSET(R.string.offset)
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.bnyro.clock.presentation.screens.alarm

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
Expand All @@ -8,9 +10,13 @@ import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.FilterAlt
import androidx.compose.material.icons.filled.Sort
import androidx.compose.material.icons.rounded.Add
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.FloatingActionButton
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
Expand All @@ -19,6 +25,7 @@ import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.bnyro.clock.R
import com.bnyro.clock.domain.model.AlarmSortOrder
import com.bnyro.clock.navigation.TopBarScaffold
import com.bnyro.clock.presentation.components.BlobIconBox
import com.bnyro.clock.presentation.components.ClickableIcon
Expand Down Expand Up @@ -47,11 +54,36 @@ fun AlarmScreen(
}
}
}, actions = {
ClickableIcon(
imageVector = Icons.Default.FilterAlt
) {
alarmModel.showFilter = !alarmModel.showFilter
if (!alarmModel.showFilter) alarmModel.resetFilters()
Row {
Box {
ClickableIcon(
imageVector = Icons.Default.Sort
) {
alarmModel.showSortOrder = !alarmModel.showSortOrder
}

DropdownMenu(
expanded = alarmModel.showSortOrder,
onDismissRequest = { alarmModel.showSortOrder = false }
) {
AlarmSortOrder.entries.forEach { sortOrder ->
DropdownMenuItem(
text = { Text(stringResource(sortOrder.value)) },
onClick = {
alarmModel.setSortOrder(sortOrder)
alarmModel.showSortOrder = false
}
)
}
}
}

ClickableIcon(
imageVector = Icons.Default.FilterAlt
) {
alarmModel.showFilter = !alarmModel.showFilter
if (!alarmModel.showFilter) alarmModel.resetFilters()
}
}
}) { pv ->

Expand All @@ -74,7 +106,6 @@ fun AlarmScreen(
{ alarmModel.updateEndTimeFilter(it) },
)
}

}

items(items = alarms, key = { it.id }) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import com.bnyro.clock.App
import com.bnyro.clock.R
import com.bnyro.clock.domain.model.Alarm
import com.bnyro.clock.domain.model.AlarmFilters
import com.bnyro.clock.domain.model.AlarmSortOrder
import com.bnyro.clock.domain.repository.AlarmRepository
import com.bnyro.clock.domain.usecase.CreateUpdateDeleteAlarmUseCase
import com.bnyro.clock.util.AlarmHelper
Expand All @@ -32,17 +33,26 @@ class AlarmModel(application: Application) : AndroidViewModel(application) {
CreateUpdateDeleteAlarmUseCase(application.applicationContext, alarmRepository)

var showFilter by mutableStateOf(false)
var showSortOrder by mutableStateOf(false)
val filters = MutableStateFlow(AlarmFilters())
val sortOrder = MutableStateFlow(AlarmSortOrder.HOUR_OF_DAY)

val alarms: StateFlow<List<Alarm>> =
combine(alarmRepository.getAlarmsStream(), filters) { items, filter ->
items.filter { alarm ->
combine(alarmRepository.getAlarmsStream(), filters, sortOrder) { items, filter, sortOrder ->
val filtered = items.filter { alarm ->
(filter.startTime <= alarm.time && alarm.time <= filter.endTime)
&& !Collections.disjoint(filter.weekDays, alarm.days)
&& (alarm.label?.lowercase()?.contains(filter.label.lowercase())
?: true) && (alarm.formattedTime.lowercase()
.contains(filter.label.lowercase()))

}

when (sortOrder) {
AlarmSortOrder.LABEL -> filtered.sortedBy { it.label }
AlarmSortOrder.HOUR_OF_DAY -> filtered.sortedBy { it.time }
AlarmSortOrder.WEEKDAY -> filtered.sortedBy { it.days.firstOrNull() }
}
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000L),
Expand Down Expand Up @@ -89,6 +99,10 @@ class AlarmModel(application: Application) : AndroidViewModel(application) {
filters.update { it.copy(endTime = endTime) }
}

fun setSortOrder(order: AlarmSortOrder) {
sortOrder.update { order }
}

fun resetFilters() {
filters.update { AlarmFilters() }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import com.bnyro.clock.R
import com.bnyro.clock.domain.model.SortOrder
import com.bnyro.clock.domain.model.TimeZoneSortOrder
import com.bnyro.clock.navigation.TopBarScaffold
import com.bnyro.clock.presentation.components.ClickableIcon
import com.bnyro.clock.presentation.screens.clock.components.DigitalClockDisplay
Expand Down Expand Up @@ -83,7 +83,7 @@ private fun TopBarActions(clockModel: ClockModel) {
}

DropdownMenu(expanded = showDropdown, onDismissRequest = { showDropdown = false }) {
SortOrder.entries.forEach {
TimeZoneSortOrder.entries.forEach {
DropdownMenuItem(text = {
Text(stringResource(it.value))
}, onClick = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.viewModelScope
import com.bnyro.clock.App
import com.bnyro.clock.domain.model.SortOrder
import com.bnyro.clock.domain.model.TimeZoneSortOrder
import com.bnyro.clock.domain.model.TimeZone
import com.bnyro.clock.util.Preferences
import com.bnyro.clock.util.TimeHelper
Expand All @@ -21,24 +21,24 @@ class ClockModel(application: Application) : AndroidViewModel(application) {
private val sortOrderPref =
Preferences.instance.getString(Preferences.clockSortOrder, "").orEmpty()
val sortOrder =
MutableStateFlow(if (sortOrderPref.isNotEmpty()) SortOrder.valueOf(sortOrderPref) else SortOrder.ALPHABETIC)
MutableStateFlow(if (sortOrderPref.isNotEmpty()) TimeZoneSortOrder.valueOf(sortOrderPref) else TimeZoneSortOrder.ALPHABETIC)
val timeZones = timezoneRepository.getTimezonesForCountries(application.applicationContext)
var selectedTimeZones = combine(
timezoneRepository.getTimezonesStream(),
sortOrder
) { selectedZones, sortOrder ->
val zones = selectedZones.distinct()
when (sortOrder) {
SortOrder.ALPHABETIC -> zones.sortedBy { it.zoneName }
SortOrder.OFFSET -> zones.sortedBy { TimeHelper.getOffsetMillisByZoneId(it.zoneId) }
TimeZoneSortOrder.ALPHABETIC -> zones.sortedBy { it.zoneName }
TimeZoneSortOrder.OFFSET -> zones.sortedBy { TimeHelper.getOffsetMillisByZoneId(it.zoneId) }
}
}.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5000L),
initialValue = listOf()
)

fun updateSortOrder(sort: SortOrder) {
fun updateSortOrder(sort: TimeZoneSortOrder) {
sortOrder.update { sort }
}

Expand Down

0 comments on commit 96e924c

Please sign in to comment.