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
10 changes: 5 additions & 5 deletions app/src/main/kotlin/org/fossify/clock/activities/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ import org.fossify.commons.helpers.LICENSE_RTL
import org.fossify.commons.helpers.LICENSE_STETHO
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.models.FAQItem
import java.time.temporal.WeekFields
import java.util.Locale

class MainActivity : SimpleActivity() {
private var storedTextColor = 0
Expand Down Expand Up @@ -407,11 +409,9 @@ class MainActivity : SimpleActivity() {

@Deprecated("Remove this method in future releases")
private fun migrateFirstDayOfWeek() {
// check existing config.isSundayFirst to migrate setting value
if (config.isSundayFirst) {
config.firstDayOfWeek = 6
// revert old setting to not run this code anymore
config.isSundayFirst = false
if (config.migrateFirstDayOfWeek) {
config.migrateFirstDayOfWeek = false
config.firstDayOfWeek = WeekFields.of(Locale.getDefault()).firstDayOfWeek.value
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ import org.fossify.commons.helpers.TAB_LAST_USED
import org.fossify.commons.helpers.ensureBackgroundThread
import org.fossify.commons.helpers.isTiramisuPlus
import org.fossify.commons.models.RadioItem
import java.time.DayOfWeek
import java.util.Locale
import kotlin.system.exitProcess

Expand Down Expand Up @@ -111,6 +112,7 @@ class SettingsActivity : SimpleActivity() {
binding.settingsGeneralSettingsLabel,
binding.settingsAlarmTabLabel,
binding.settingsTimerTabLabel,
binding.settingsMigratingLabel
).forEach {
it.setTextColor(getProperPrimaryColor())
}
Expand Down Expand Up @@ -198,24 +200,31 @@ class SettingsActivity : SimpleActivity() {
}

private fun setupStartWeekOn() {
val items = arrayListOf(
RadioItem(6, getString(org.fossify.commons.R.string.sunday)),
RadioItem(0, getString(org.fossify.commons.R.string.monday)),
RadioItem(1, getString(org.fossify.commons.R.string.tuesday)),
RadioItem(2, getString(org.fossify.commons.R.string.wednesday)),
RadioItem(3, getString(org.fossify.commons.R.string.thursday)),
RadioItem(4, getString(org.fossify.commons.R.string.friday)),
RadioItem(5, getString(org.fossify.commons.R.string.saturday)),
binding.settingsStartWeekOn.text = resources.getStringArray(
org.fossify.commons.R.array.week_days
)[config.firstDayOfWeek - 1]

val weekDays = arrayListOf(
RadioItem(DayOfWeek.SUNDAY.value, getString(org.fossify.commons.R.string.sunday)),
RadioItem(DayOfWeek.MONDAY.value, getString(org.fossify.commons.R.string.monday)),
RadioItem(DayOfWeek.TUESDAY.value, getString(org.fossify.commons.R.string.tuesday)),
RadioItem(DayOfWeek.WEDNESDAY.value, getString(org.fossify.commons.R.string.wednesday)),
RadioItem(DayOfWeek.THURSDAY.value, getString(org.fossify.commons.R.string.thursday)),
RadioItem(DayOfWeek.FRIDAY.value, getString(org.fossify.commons.R.string.friday)),
RadioItem(DayOfWeek.SATURDAY.value, getString(org.fossify.commons.R.string.saturday)),
)

binding.settingsStartWeekOn.text =
resources.getStringArray(org.fossify.commons.R.array.week_days)[config.firstDayOfWeek]
binding.settingsStartWeekOnHolder.setOnClickListener {
RadioGroupDialog(this@SettingsActivity, items, config.firstDayOfWeek) { day ->
RadioGroupDialog(
activity = this,
items = weekDays,
checkedItemId = config.firstDayOfWeek
) { day ->
val firstDayOfWeek = day as Int
config.firstDayOfWeek = firstDayOfWeek
binding.settingsStartWeekOn.text =
resources.getStringArray(org.fossify.commons.R.array.week_days)[config.firstDayOfWeek]
binding.settingsStartWeekOn.text = resources.getStringArray(
org.fossify.commons.R.array.week_days
)[config.firstDayOfWeek - 1]
}
}
}
Expand Down Expand Up @@ -338,7 +347,7 @@ class SettingsActivity : SimpleActivity() {
ExportDataDialog(this, config.lastDataExportPath) { file ->
try {
exportActivityResultLauncher.launch(file.name)
} catch (@Suppress("SwallowedException") e: ActivityNotFoundException) {
} catch (@Suppress("SwallowedException") _: ActivityNotFoundException) {
toast(
id = org.fossify.commons.R.string.system_service_disabled,
length = Toast.LENGTH_LONG
Expand All @@ -352,7 +361,7 @@ class SettingsActivity : SimpleActivity() {
private fun tryImportData() {
try {
importActivityResultLauncher.launch(IMPORT_BACKUP_MIME_TYPES.toTypedArray())
} catch (@Suppress("SwallowedException") e: ActivityNotFoundException) {
} catch (@Suppress("SwallowedException") _: ActivityNotFoundException) {
toast(org.fossify.commons.R.string.system_service_disabled, Toast.LENGTH_LONG)
} catch (e: Exception) {
showErrorToast(e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import org.fossify.clock.extensions.config
import org.fossify.clock.extensions.dbHelper
import org.fossify.clock.extensions.getFormattedTime
import org.fossify.clock.extensions.handleFullScreenNotificationsPermission
import org.fossify.clock.extensions.orderDaysList
import org.fossify.clock.extensions.rotateWeekdays
import org.fossify.clock.helpers.PICK_AUDIO_FILE_INTENT_ID
import org.fossify.clock.helpers.TODAY_BIT
import org.fossify.clock.helpers.TOMORROW_BIT
Expand Down Expand Up @@ -124,7 +124,7 @@ class EditAlarmDialog(
val dayLetters =
activity.resources.getStringArray(org.fossify.commons.R.array.week_day_letters)
.toList() as ArrayList<String>
val dayIndexes = activity.orderDaysList(arrayListOf(0, 1, 2, 3, 4, 5, 6))
val dayIndexes = activity.rotateWeekdays(arrayListOf(0, 1, 2, 3, 4, 5, 6))

dayIndexes.forEach {
val bitmask = 1 shl it
Expand Down
16 changes: 5 additions & 11 deletions app/src/main/kotlin/org/fossify/clock/extensions/Context.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ import org.fossify.clock.helpers.ALARM_ID
import org.fossify.clock.helpers.AlarmController
import org.fossify.clock.helpers.Config
import org.fossify.clock.helpers.DBHelper
import org.fossify.clock.helpers.UPCOMING_ALARM_INTENT_ID
import org.fossify.clock.helpers.EDITED_TIME_ZONE_SEPARATOR
import org.fossify.clock.helpers.FORMAT_12H
import org.fossify.clock.helpers.FORMAT_24H
Expand All @@ -45,6 +44,7 @@ import org.fossify.clock.helpers.TIMER_ID
import org.fossify.clock.helpers.TODAY_BIT
import org.fossify.clock.helpers.TOMORROW_BIT
import org.fossify.clock.helpers.TimerHelper
import org.fossify.clock.helpers.UPCOMING_ALARM_INTENT_ID
import org.fossify.clock.helpers.formatTime
import org.fossify.clock.helpers.getAllTimeZones
import org.fossify.clock.helpers.getDefaultTimeZoneTitle
Expand All @@ -69,6 +69,7 @@ import org.fossify.commons.extensions.getProperPrimaryColor
import org.fossify.commons.extensions.getSelectedDaysString
import org.fossify.commons.extensions.grantReadUriPermission
import org.fossify.commons.extensions.notificationManager
import org.fossify.commons.extensions.rotateLeft
import org.fossify.commons.extensions.showErrorToast
import org.fossify.commons.extensions.toInt
import org.fossify.commons.extensions.toast
Expand Down Expand Up @@ -566,24 +567,17 @@ fun Context.getAlarmSelectedDaysString(bitMask: Int): String {
TODAY_BIT -> getString(org.fossify.commons.R.string.today)
TOMORROW_BIT -> getString(org.fossify.commons.R.string.tomorrow)
EVERY_DAY_BIT -> getString(org.fossify.commons.R.string.every_day)
else -> getSelectedDaysString(bitMask)
else -> getSelectedDaysString(bitMask) // TODO: This does not respect config.firstDayOfWeek
}
}

fun Context.orderDaysList(days: List<Int>): List<Int> {
if (config.firstDayOfWeek > 0) {
val range = (config.firstDayOfWeek..6).toList() + (0..<config.firstDayOfWeek).toList()
return days.slice(range)
} else {
return days
}
}
fun Context.rotateWeekdays(days: List<Int>) = days.rotateLeft(config.firstDayOfWeek - 1)

fun Context.firstDayOrder(bitMask: Int): Int {
if (bitMask == TODAY_BIT) return -2
if (bitMask == TOMORROW_BIT) return -1

val dayBits = orderDaysList(
val dayBits = rotateWeekdays(
arrayListOf(
MONDAY_BIT,
TUESDAY_BIT,
Expand Down
85 changes: 53 additions & 32 deletions app/src/main/kotlin/org/fossify/clock/helpers/Config.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package org.fossify.clock.helpers

import android.content.Context
import android.media.RingtoneManager
import androidx.core.content.edit
import org.fossify.clock.extensions.gson.gson
import org.fossify.clock.models.Alarm
import org.fossify.clock.models.ObfuscatedAlarm
Expand All @@ -11,8 +12,6 @@ import org.fossify.commons.extensions.getDefaultAlarmSound
import org.fossify.commons.extensions.getDefaultAlarmTitle
import org.fossify.commons.helpers.BaseConfig
import org.fossify.commons.helpers.SORT_DESCENDING
import java.util.Calendar
import java.util.Locale

class Config(context: Context) : BaseConfig(context) {
companion object {
Expand All @@ -21,63 +20,81 @@ class Config(context: Context) : BaseConfig(context) {

var selectedTimeZones: Set<String>
get() = prefs.getStringSet(SELECTED_TIME_ZONES, HashSet())!!
set(selectedTimeZones) = prefs.edit().putStringSet(SELECTED_TIME_ZONES, selectedTimeZones).apply()
set(selectedTimeZones) = prefs.edit { putStringSet(SELECTED_TIME_ZONES, selectedTimeZones) }

var editedTimeZoneTitles: Set<String>
get() = prefs.getStringSet(EDITED_TIME_ZONE_TITLES, HashSet())!!
set(editedTimeZoneTitles) = prefs.edit().putStringSet(EDITED_TIME_ZONE_TITLES, editedTimeZoneTitles).apply()
set(editedTimeZoneTitles) = prefs.edit {
putStringSet(EDITED_TIME_ZONE_TITLES, editedTimeZoneTitles)
}

var timerSeconds: Int
get() = prefs.getInt(TIMER_SECONDS, 300)
set(lastTimerSeconds) = prefs.edit().putInt(TIMER_SECONDS, lastTimerSeconds).apply()
set(lastTimerSeconds) = prefs.edit { putInt(TIMER_SECONDS, lastTimerSeconds) }

var timerVibrate: Boolean
get() = prefs.getBoolean(TIMER_VIBRATE, false)
set(timerVibrate) = prefs.edit().putBoolean(TIMER_VIBRATE, timerVibrate).apply()
set(timerVibrate) = prefs.edit { putBoolean(TIMER_VIBRATE, timerVibrate) }

var timerSoundUri: String
get() = prefs.getString(TIMER_SOUND_URI, context.getDefaultAlarmSound(RingtoneManager.TYPE_ALARM).uri)!!
set(timerSoundUri) = prefs.edit().putString(TIMER_SOUND_URI, timerSoundUri).apply()
get() = prefs.getString(
TIMER_SOUND_URI,
context.getDefaultAlarmSound(RingtoneManager.TYPE_ALARM).uri
)!!
set(timerSoundUri) = prefs.edit { putString(TIMER_SOUND_URI, timerSoundUri) }

var timerSoundTitle: String
get() = prefs.getString(TIMER_SOUND_TITLE, context.getDefaultAlarmTitle(RingtoneManager.TYPE_ALARM))!!
set(timerSoundTitle) = prefs.edit().putString(TIMER_SOUND_TITLE, timerSoundTitle).apply()
get() = prefs.getString(
TIMER_SOUND_TITLE,
context.getDefaultAlarmTitle(RingtoneManager.TYPE_ALARM)
)!!
set(timerSoundTitle) = prefs.edit { putString(TIMER_SOUND_TITLE, timerSoundTitle) }

var timerMaxReminderSecs: Int
get() = prefs.getInt(TIMER_MAX_REMINDER_SECS, DEFAULT_MAX_TIMER_REMINDER_SECS)
set(timerMaxReminderSecs) = prefs.edit().putInt(TIMER_MAX_REMINDER_SECS, timerMaxReminderSecs).apply()
set(timerMaxReminderSecs) = prefs.edit {
putInt(TIMER_MAX_REMINDER_SECS, timerMaxReminderSecs)
}

var timerLabel: String?
get() = prefs.getString(TIMER_LABEL, null)
set(label) = prefs.edit().putString(TIMER_LABEL, label).apply()
set(label) = prefs.edit { putString(TIMER_LABEL, label) }

var toggleStopwatch: Boolean
get() = prefs.getBoolean(TOGGLE_STOPWATCH, false)
set(toggleStopwatch) = prefs.edit().putBoolean(TOGGLE_STOPWATCH, toggleStopwatch).apply()
set(toggleStopwatch) = prefs.edit { putBoolean(TOGGLE_STOPWATCH, toggleStopwatch) }

var alarmSort: Int
get() = prefs.getInt(ALARMS_SORT_BY, SORT_BY_CREATION_ORDER)
set(alarmSort) = prefs.edit().putInt(ALARMS_SORT_BY, alarmSort).apply()
set(alarmSort) = prefs.edit { putInt(ALARMS_SORT_BY, alarmSort) }

var alarmsCustomSorting: String
get() = prefs.getString(ALARMS_CUSTOM_SORTING, "")!!
set(alarmsCustomSorting) = prefs.edit().putString(ALARMS_CUSTOM_SORTING, alarmsCustomSorting).apply()
set(alarmsCustomSorting) = prefs.edit {
putString(ALARMS_CUSTOM_SORTING, alarmsCustomSorting)
}

var timerSort: Int
get() = prefs.getInt(TIMERS_SORT_BY, SORT_BY_CREATION_ORDER)
set(timerSort) = prefs.edit().putInt(TIMERS_SORT_BY, timerSort).apply()
set(timerSort) = prefs.edit { putInt(TIMERS_SORT_BY, timerSort) }

var timersCustomSorting: String
get() = prefs.getString(TIMERS_CUSTOM_SORTING, "")!!
set(timersCustomSorting) = prefs.edit().putString(TIMERS_CUSTOM_SORTING, timersCustomSorting).apply()
set(timersCustomSorting) = prefs.edit {
putString(TIMERS_CUSTOM_SORTING, timersCustomSorting)
}

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()
set(alarmMaxReminderSecs) = prefs.edit {
putInt(ALARM_MAX_REMINDER_SECS, alarmMaxReminderSecs)
}

var increaseVolumeGradually: Boolean
get() = prefs.getBoolean(INCREASE_VOLUME_GRADUALLY, true)
set(increaseVolumeGradually) = prefs.edit().putBoolean(INCREASE_VOLUME_GRADUALLY, increaseVolumeGradually).apply()
set(increaseVolumeGradually) = prefs.edit {
putBoolean(INCREASE_VOLUME_GRADUALLY, increaseVolumeGradually)
}

var alarmLastConfig: Alarm?
get() = prefs.getString(ALARM_LAST_CONFIG, null)?.let { lastAlarm ->
Expand All @@ -87,11 +104,11 @@ class Config(context: Context) : BaseConfig(context) {
} else {
gson.fromJson(lastAlarm, Alarm::class.java)
}
} catch (e: Exception) {
} catch (_: Exception) {
null
}
}
set(alarm) = prefs.edit().putString(ALARM_LAST_CONFIG, gson.toJson(alarm)).apply()
set(alarm) = prefs.edit { putString(ALARM_LAST_CONFIG, gson.toJson(alarm)) }

var timerLastConfig: Timer?
get() = prefs.getString(TIMER_LAST_CONFIG, null)?.let { lastTimer ->
Expand All @@ -101,32 +118,36 @@ class Config(context: Context) : BaseConfig(context) {
} else {
gson.fromJson(lastTimer, Timer::class.java)
}
} catch (e: Exception) {
} catch (_: Exception) {
null
}
}
set(timer) = prefs.edit().putString(TIMER_LAST_CONFIG, gson.toJson(timer)).apply()
set(timer) = prefs.edit { putString(TIMER_LAST_CONFIG, gson.toJson(timer)) }

var timerChannelId: String?
get() = prefs.getString(TIMER_CHANNEL_ID, null)
set(id) = prefs.edit().putString(TIMER_CHANNEL_ID, id).apply()
set(id) = prefs.edit { putString(TIMER_CHANNEL_ID, id) }

var stopwatchLapsSort: Int
get() = prefs.getInt(STOPWATCH_LAPS_SORT_BY, SORT_BY_LAP or SORT_DESCENDING)
set(stopwatchLapsSort) = prefs.edit().putInt(STOPWATCH_LAPS_SORT_BY, stopwatchLapsSort).apply()
set(stopwatchLapsSort) = prefs.edit { putInt(STOPWATCH_LAPS_SORT_BY, stopwatchLapsSort) }

var wasInitialWidgetSetUp: Boolean
get() = prefs.getBoolean(WAS_INITIAL_WIDGET_SET_UP, false)
set(wasInitialWidgetSetUp) = prefs.edit().putBoolean(WAS_INITIAL_WIDGET_SET_UP, wasInitialWidgetSetUp).apply()
set(wasInitialWidgetSetUp) = prefs.edit {
putBoolean(WAS_INITIAL_WIDGET_SET_UP, wasInitialWidgetSetUp)
}

var lastDataExportPath: String
get() = prefs.getString(LAST_DATA_EXPORT_PATH, "")!!
set(lastDataExportPath) = prefs.edit().putString(LAST_DATA_EXPORT_PATH, lastDataExportPath).apply()
set(lastDataExportPath) = prefs.edit {
putString(LAST_DATA_EXPORT_PATH, lastDataExportPath)
}

var firstDayOfWeek: Int
get() {
val defaultFirstDayOfWeek = Calendar.getInstance(Locale.getDefault()).firstDayOfWeek
return prefs.getInt(FIRST_DAY_OF_WEEK, getDayNumber(defaultFirstDayOfWeek))
@Deprecated("Remove this method in future releases")
var migrateFirstDayOfWeek: Boolean
get() = prefs.getBoolean(MIGRATE_FIRST_DAY_OF_WEEK, true)
set(migrateFirstDayOfWeek) = prefs.edit {
putBoolean(MIGRATE_FIRST_DAY_OF_WEEK, migrateFirstDayOfWeek)
}
set(firstDayOfWeek) = prefs.edit().putInt(FIRST_DAY_OF_WEEK, firstDayOfWeek).apply()
}
4 changes: 2 additions & 2 deletions app/src/main/kotlin/org/fossify/clock/helpers/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const val STOPWATCH_LAPS_SORT_BY = "stopwatch_laps_sort_by"
const val WAS_INITIAL_WIDGET_SET_UP = "was_initial_widget_set_up"
const val DATA_EXPORT_EXTENSION = ".json"
const val LAST_DATA_EXPORT_PATH = "last_alarms_export_path"
const val FIRST_DAY_OF_WEEK = "first_day_of_week"
const val MIGRATE_FIRST_DAY_OF_WEEK = "migrate_first_day_of_week"

const val TABS_COUNT = 4
const val EDITED_TIME_ZONE_SEPARATOR = ":"
Expand Down Expand Up @@ -100,7 +100,7 @@ const val FORMAT_24H = "HH:mm"
const val FORMAT_12H_WITH_SECONDS = "h:mm:ss a"
const val FORMAT_24H_WITH_SECONDS = "HH:mm:ss"

val DAY_BIT_MAP = mapOf(
private val DAY_BIT_MAP = mapOf(
Calendar.SUNDAY to SUNDAY_BIT,
Calendar.MONDAY to MONDAY_BIT,
Calendar.TUESDAY to TUESDAY_BIT,
Expand Down
Loading
Loading