From 12ee706b4eb5fb4fea86b55f0d4b9bc0b210319f Mon Sep 17 00:00:00 2001 From: jkemming Date: Sat, 26 Dec 2020 14:09:14 +0100 Subject: [PATCH] feat: Add option to sort alarms --- .../clock/dialogs/ChangeAlarmSortDialog.kt | 42 +++++++++++++++++++ .../clock/fragments/AlarmFragment.kt | 26 ++++++++++-- .../simplemobiletools/clock/helpers/Config.kt | 6 +++ .../clock/helpers/Constants.kt | 1 + .../clock/helpers/DBHelper.kt | 10 ++++- .../clock/models/AlarmSort.kt | 18 ++++++++ .../res/layout/dialog_change_alarm_sort.xml | 33 +++++++++++++++ app/src/main/res/menu/menu_alarm.xml | 9 ++++ app/src/main/res/values-az/strings.xml | 2 + app/src/main/res/values-cs/strings.xml | 2 + app/src/main/res/values-cy/strings.xml | 2 + app/src/main/res/values-da/strings.xml | 2 + app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values-el/strings.xml | 2 + app/src/main/res/values-es/strings.xml | 2 + app/src/main/res/values-eu/strings.xml | 2 + app/src/main/res/values-fi/strings.xml | 4 +- app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values-hr/strings.xml | 2 + app/src/main/res/values-id/strings.xml | 2 + app/src/main/res/values-in/strings.xml | 2 + app/src/main/res/values-it/strings.xml | 2 + app/src/main/res/values-ja/strings.xml | 2 + app/src/main/res/values-lt/strings.xml | 2 + app/src/main/res/values-ml/strings.xml | 2 + app/src/main/res/values-nb/strings.xml | 2 + app/src/main/res/values-nl/strings.xml | 2 + app/src/main/res/values-pl/strings.xml | 2 + app/src/main/res/values-pt/strings.xml | 2 + app/src/main/res/values-ru/strings.xml | 2 + app/src/main/res/values-sk/strings.xml | 2 + app/src/main/res/values-sv/strings.xml | 2 + app/src/main/res/values-tr/strings.xml | 2 + app/src/main/res/values-uk/strings.xml | 2 + app/src/main/res/values-zh-rCN/strings.xml | 2 + app/src/main/res/values-zh-rTW/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 37 files changed, 198 insertions(+), 7 deletions(-) create mode 100644 app/src/main/kotlin/com/simplemobiletools/clock/dialogs/ChangeAlarmSortDialog.kt create mode 100644 app/src/main/kotlin/com/simplemobiletools/clock/models/AlarmSort.kt create mode 100644 app/src/main/res/layout/dialog_change_alarm_sort.xml create mode 100644 app/src/main/res/menu/menu_alarm.xml diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/ChangeAlarmSortDialog.kt b/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/ChangeAlarmSortDialog.kt new file mode 100644 index 00000000..bde85e3b --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/clock/dialogs/ChangeAlarmSortDialog.kt @@ -0,0 +1,42 @@ +package com.simplemobiletools.clock.dialogs + +import android.view.View +import androidx.appcompat.app.AlertDialog +import com.simplemobiletools.clock.R +import com.simplemobiletools.clock.extensions.config +import com.simplemobiletools.clock.models.AlarmSort +import com.simplemobiletools.commons.activities.BaseSimpleActivity +import com.simplemobiletools.commons.extensions.setupDialogStuff +import kotlinx.android.synthetic.main.dialog_change_alarm_sort.view.* + +class ChangeAlarmSortDialog(val activity: BaseSimpleActivity, val callback: (AlarmSort) -> Unit) { + private var view: View + + init { + view = activity.layoutInflater.inflate(R.layout.dialog_change_alarm_sort, null).apply { + val activeRadioButton = when (activity.config.alarmSort) { + AlarmSort.CREATED_AT -> sorting_dialog_radio_created_at + AlarmSort.TIME_OF_DAY -> sorting_dialog_radio_time_of_day + } + activeRadioButton?.isChecked = true + } + + AlertDialog.Builder(activity) + .setPositiveButton(R.string.ok) { _, _ -> dialogConfirmed() } + .setNegativeButton(R.string.cancel, null) + .create().apply { + activity.setupDialogStuff(view, this, R.string.sort_by) + } + } + + private fun dialogConfirmed() { + val sort = when (view.sorting_dialog_radio_sorting.checkedRadioButtonId) { + R.id.sorting_dialog_radio_created_at -> AlarmSort.CREATED_AT + R.id.sorting_dialog_radio_time_of_day -> AlarmSort.TIME_OF_DAY + else -> AlarmSort.default() + } + activity.config.alarmSort = sort + + callback(sort) + } +} diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/AlarmFragment.kt b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/AlarmFragment.kt index 8dc77656..92c4fbba 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/fragments/AlarmFragment.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/fragments/AlarmFragment.kt @@ -1,14 +1,13 @@ package com.simplemobiletools.clock.fragments import android.os.Bundle -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import androidx.fragment.app.Fragment import com.simplemobiletools.clock.R import com.simplemobiletools.clock.activities.MainActivity import com.simplemobiletools.clock.activities.SimpleActivity import com.simplemobiletools.clock.adapters.AlarmsAdapter +import com.simplemobiletools.clock.dialogs.ChangeAlarmSortDialog import com.simplemobiletools.clock.dialogs.EditAlarmDialog import com.simplemobiletools.clock.extensions.* import com.simplemobiletools.clock.helpers.DEFAULT_ALARM_MINUTES @@ -34,6 +33,7 @@ class AlarmFragment : Fragment(), ToggleAlarmInterface { override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { storeStateVariables() + setHasOptionsMenu(true) view = inflater.inflate(R.layout.fragment_alarm, container, false) as ViewGroup return view } @@ -53,6 +53,24 @@ class AlarmFragment : Fragment(), ToggleAlarmInterface { storeStateVariables() } + override fun onCreateOptionsMenu(menu: Menu, menuInflater: MenuInflater) { + menuInflater.inflate(R.menu.menu_alarm, menu) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.sort -> showSortingDialog() + else -> return super.onOptionsItemSelected(item) + } + return true + } + + private fun showSortingDialog() { + ChangeAlarmSortDialog(activity as SimpleActivity) { + setupAlarms() + } + } + private fun storeStateVariables() { storedTextColor = requireContext().config.textColor } @@ -72,7 +90,7 @@ class AlarmFragment : Fragment(), ToggleAlarmInterface { } private fun setupAlarms() { - alarms = context?.dbHelper?.getAlarms() ?: return + alarms = context?.dbHelper?.getAlarms(context?.config?.alarmSort) ?: return if (context?.getNextAlarm()?.isEmpty() == true) { alarms.forEach { if (it.days == TODAY_BIT && it.isEnabled && it.timeInMinutes <= getCurrentDayMinutes()) { diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt index 1582daab..bac2027d 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Config.kt @@ -1,6 +1,7 @@ package com.simplemobiletools.clock.helpers import android.content.Context +import com.simplemobiletools.clock.models.AlarmSort import com.simplemobiletools.clock.extensions.gson.gson import com.simplemobiletools.clock.models.Alarm import com.simplemobiletools.clock.models.StateWrapper @@ -57,6 +58,11 @@ class Config(context: Context) : BaseConfig(context) { get() = prefs.getString(TIMER_LABEL, null) set(label) = prefs.edit().putString(TIMER_LABEL, label).apply() + var alarmSort: AlarmSort + get() = AlarmSort.valueOf(prefs.getInt(ALARM_SORT, AlarmSort.default().value)) + ?: AlarmSort.default() + set(alarmSort) = prefs.edit().putInt(ALARM_SORT, alarmSort.value).apply() + var alarmMaxReminderSecs: Int get() = prefs.getInt(ALARM_MAX_REMINDER_SECS, DEFAULT_MAX_ALARM_REMINDER_SECS) set(alarmMaxReminderSecs) = prefs.edit().putInt(ALARM_MAX_REMINDER_SECS, alarmMaxReminderSecs).apply() diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt index ba58439f..41d8f9a2 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/Constants.kt @@ -17,6 +17,7 @@ const val TIMER_SOUND_TITLE = "timer_sound_title" const val TIMER_CHANNEL_ID = "timer_channel_id" const val TIMER_LABEL = "timer_label" const val TIMER_MAX_REMINDER_SECS = "timer_max_reminder_secs" +const val ALARM_SORT = "alarm_sort" const val ALARM_MAX_REMINDER_SECS = "alarm_max_reminder_secs" const val ALARM_LAST_CONFIG = "alarm_last_config" const val USE_TEXT_SHADOW = "use_text_shadow" diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/DBHelper.kt index 203cad92..adf13f81 100644 --- a/app/src/main/kotlin/com/simplemobiletools/clock/helpers/DBHelper.kt +++ b/app/src/main/kotlin/com/simplemobiletools/clock/helpers/DBHelper.kt @@ -6,6 +6,7 @@ import android.database.Cursor import android.database.sqlite.SQLiteDatabase import android.database.sqlite.SQLiteOpenHelper import android.text.TextUtils +import com.simplemobiletools.clock.models.AlarmSort import com.simplemobiletools.clock.extensions.cancelAlarmClock import com.simplemobiletools.clock.extensions.createNewAlarm import com.simplemobiletools.clock.models.Alarm @@ -106,12 +107,17 @@ class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(cont fun getEnabledAlarms() = getAlarms().filter { it.isEnabled } - fun getAlarms(): ArrayList { + fun getAlarms(sort: AlarmSort? = null): ArrayList { val alarms = ArrayList() val cols = arrayOf(COL_ID, COL_TIME_IN_MINUTES, COL_DAYS, COL_IS_ENABLED, COL_VIBRATE, COL_SOUND_TITLE, COL_SOUND_URI, COL_LABEL) + val orderBy = when (sort) { + AlarmSort.CREATED_AT -> "$COL_ID ASC" + AlarmSort.TIME_OF_DAY -> "$COL_TIME_IN_MINUTES ASC" + else -> null + } var cursor: Cursor? = null try { - cursor = mDb.query(ALARMS_TABLE_NAME, cols, null, null, null, null, null) + cursor = mDb.query(ALARMS_TABLE_NAME, cols, null, null, null, null, orderBy) if (cursor?.moveToFirst() == true) { do { try { diff --git a/app/src/main/kotlin/com/simplemobiletools/clock/models/AlarmSort.kt b/app/src/main/kotlin/com/simplemobiletools/clock/models/AlarmSort.kt new file mode 100644 index 00000000..56342648 --- /dev/null +++ b/app/src/main/kotlin/com/simplemobiletools/clock/models/AlarmSort.kt @@ -0,0 +1,18 @@ +package com.simplemobiletools.clock.models + +enum class AlarmSort(open val value: Int) { + CREATED_AT(0), + TIME_OF_DAY(1); + + companion object { + fun default(): AlarmSort { + return CREATED_AT + } + + fun valueOf(value: Int): AlarmSort? { + return AlarmSort.values() + .filter { it.value == value } + .getOrNull(0) + } + } +} diff --git a/app/src/main/res/layout/dialog_change_alarm_sort.xml b/app/src/main/res/layout/dialog_change_alarm_sort.xml new file mode 100644 index 00000000..3c6aa7ec --- /dev/null +++ b/app/src/main/res/layout/dialog_change_alarm_sort.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + diff --git a/app/src/main/res/menu/menu_alarm.xml b/app/src/main/res/menu/menu_alarm.xml new file mode 100644 index 00000000..42b62266 --- /dev/null +++ b/app/src/main/res/menu/menu_alarm.xml @@ -0,0 +1,9 @@ + + + + diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 579b8448..3fd31d9d 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -2,6 +2,8 @@ Sadə Saat Saat Vaxt zonası + Created at + Time of day Titrət Etiket Gün seçilməyib diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c8a85c02..1600575a 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -2,6 +2,8 @@ Jednoduché hodiny Hodiny Časové pásmo + Created at + Time of day Vibrovat Štítek Nebyly označeny žádné dny diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index f9262a74..d93c2434 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -2,6 +2,8 @@ Simple Clock Cloc Cylchfa amser + Created at + Time of day Dirgrynu Label Dim diwrnodau wedi\'u dewis diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index e5fe21f2..4466831c 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -2,6 +2,8 @@ Simple Clock Ur Tidszone + Created at + Time of day Vibrer Etiket Der er ikke valgt nogen dage diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 733257c4..cfc9cc7d 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -2,6 +2,8 @@ Schlichte Uhr Uhr Zeitzone + Erstellt am + Tageszeit Vibration Label Keine Tage ausgewählt diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index e1906bbf..4181da43 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -3,6 +3,8 @@ Απλό Ρολόι Ρολόι Ζώνη ώρας + Created at + Time of day Δόνηση Ετικέτα Δεν έχουν επιλεγεί ημέρες diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index f9240c39..4d4c7393 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -2,6 +2,8 @@ Simple Clock Reloj Zona horaria + Created at + Time of day Vibrar Etiqueta Ningún día seleccionado diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index c7e3f1d3..7b69b268 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -2,6 +2,8 @@ Ordulari sinplea Ordularia Ordu eremua + Created at + Time of day Bibratu Etiketa Ez duzu egunik hautatu diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index 091e6743..553bea28 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -2,6 +2,8 @@ Simple Clock Kello Aikavyöhyke + Created at + Time of day Värinä Nimi Ei päiviä valittuna @@ -56,7 +58,7 @@ Reddit: https://www.reddit.com/r/SimpleMobileTools -  +