Skip to content

Commit

Permalink
Allow sorting the world clocks (closes #86)
Browse files Browse the repository at this point in the history
  • Loading branch information
Bnyro committed Jun 27, 2023
1 parent 17a9628 commit 2ff068b
Show file tree
Hide file tree
Showing 7 changed files with 69 additions and 6 deletions.
9 changes: 9 additions & 0 deletions app/src/main/java/com/bnyro/clock/obj/SortOrder.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.bnyro.clock.obj

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

enum class SortOrder(@StringRes val value: Int) {
ALPHABETIC(R.string.alphabetic),
OFFSET(R.string.offset)
}
6 changes: 6 additions & 0 deletions app/src/main/java/com/bnyro/clock/ui/model/ClockModel.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import androidx.core.os.postDelayed
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.bnyro.clock.db.DatabaseHolder
import com.bnyro.clock.obj.SortOrder
import com.bnyro.clock.util.Preferences
import com.bnyro.clock.util.TimeHelper
import java.util.*
import kotlinx.coroutines.Dispatchers
Expand All @@ -19,6 +21,10 @@ class ClockModel : ViewModel() {
private val handlerKey = "clockUpdateTimeHandler"
private val handler = Handler(Looper.getMainLooper())
var currentDate by mutableStateOf<Date>(Calendar.getInstance().time)
private val sortOrderPref = Preferences.instance.getString(Preferences.clockSortOrder, "").orEmpty()
var sortOrder by mutableStateOf(
if (sortOrderPref.isNotEmpty()) SortOrder.valueOf(sortOrderPref) else SortOrder.ALPHABETIC
)

val timeZones = TimeHelper.getAvailableTimeZones()
var selectedTimeZones by mutableStateOf(
Expand Down
41 changes: 40 additions & 1 deletion app/src/main/java/com/bnyro/clock/ui/nav/NavContainer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,23 +6,29 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.icons.filled.Sort
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel
import androidx.navigation.NavController
import androidx.navigation.compose.rememberNavController
import com.bnyro.clock.obj.SortOrder
import com.bnyro.clock.ui.components.ClickableIcon
import com.bnyro.clock.ui.model.ClockModel
import com.bnyro.clock.ui.model.SettingsModel
import com.bnyro.clock.util.Preferences

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun NavContainer(
settingsModel: SettingsModel,
initialTab: NavRoutes
) {
val clockModel: ClockModel = viewModel()
val navController = rememberNavController()
val bottomNavItems = listOf(
NavRoutes.Clock,
Expand Down Expand Up @@ -58,6 +64,7 @@ fun NavContainer(
NavRoutes.Settings ->
Modifier
.nestedScroll(scrollBehavior.nestedScrollConnection)

else -> Modifier
},
topBar = {
Expand All @@ -74,11 +81,43 @@ fun NavContainer(
},
scrollBehavior = scrollBehavior
)

else -> TopAppBar(
title = {
Text(stringResource(selectedRoute.stringRes))
},
actions = {
if (selectedRoute == NavRoutes.Clock) {
Box {
var showDropdown by remember {
mutableStateOf(false)
}

ClickableIcon(imageVector = Icons.Default.Sort) {
showDropdown = true
}

DropdownMenu(
expanded = showDropdown,
onDismissRequest = { showDropdown = false }
) {
SortOrder.values().forEach {
DropdownMenuItem(
text = {
Text(stringResource(it.value))
},
onClick = {
clockModel.sortOrder = it
Preferences.edit {
putString(Preferences.clockSortOrder, it.name)
}
showDropdown = false
}
)
}
}
}
}
ClickableIcon(imageVector = Icons.Default.Settings) {
navController.navigate(NavRoutes.Settings.route)
}
Expand Down Expand Up @@ -112,7 +151,7 @@ fun NavContainer(
Box(
modifier = Modifier.padding(pV)
) {
AppNavHost(navController, settingsModel)
AppNavHost(navController, settingsModel, clockModel)
}
}
}
4 changes: 2 additions & 2 deletions app/src/main/java/com/bnyro/clock/ui/nav/NavHost.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ import com.bnyro.clock.ui.screens.TimerScreen
@Composable
fun AppNavHost(
navController: NavHostController,
settingsModel: SettingsModel
settingsModel: SettingsModel,
clockModel: ClockModel
) {
val clockModel: ClockModel = viewModel()
val alarmModel: AlarmModel = viewModel()
val timerModel: TimerModel = viewModel()
val stopwatchModel: StopwatchModel = viewModel()
Expand Down
10 changes: 7 additions & 3 deletions app/src/main/java/com/bnyro/clock/ui/screens/ClockScreen.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.bnyro.clock.R
import com.bnyro.clock.obj.SortOrder
import com.bnyro.clock.ui.components.DialogButton
import com.bnyro.clock.ui.model.ClockModel
import com.bnyro.clock.util.TimeHelper
Expand Down Expand Up @@ -66,9 +67,12 @@ fun ClockScreen(clockModel: ClockModel) {

Spacer(modifier = Modifier.height(10.dp))

clockModel.timeZones
.filter { clockModel.selectedTimeZones.contains(it) }
.forEach { timeZone ->
val zones = clockModel.selectedTimeZones.distinct()
val sortedZones = when (clockModel.sortOrder) {
SortOrder.ALPHABETIC -> zones.sortedBy { it.displayName }
SortOrder.OFFSET -> zones.sortedBy { it.offset }
}
sortedZones.forEach { timeZone ->
val dateTime = clockModel.getDateWithOffset(
clockModel.currentDate,
timeZone.offset
Expand Down
1 change: 1 addition & 0 deletions app/src/main/java/com/bnyro/clock/util/Preferences.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ object Preferences {
const val showSecondsKey = "showSeconds"
const val themeKey = "theme"
const val timerUsePickerKey = "timerUsePicker"
const val clockSortOrder = "clockSortOrder"

fun init(context: Context) {
instance = context.getSharedPreferences("clock_you", Context.MODE_PRIVATE)
Expand Down
4 changes: 4 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@
<string name="start_timer">Start timer?</string>
<string name="duration_seconds">Duration: %1$s</string>

<!-- Sorting -->
<string name="alphabetic">Alphabetic</string>
<string name="offset">Offset</string>

<!-- Settings -->
<string name="appearance">Appearance</string>
<string name="show_seconds">Show seconds</string>
Expand Down

0 comments on commit 2ff068b

Please sign in to comment.