From 21d694b1567b648a6daf235953ca5de173f9ab07 Mon Sep 17 00:00:00 2001 From: the_mr17 Date: Sun, 3 Sep 2023 21:32:15 +0530 Subject: [PATCH 1/6] Implements customizable alarm vibration --- .../alarm/presenter/AlarmDetailsFragment.kt | 18 +++++++++ .../res/layout/details_fragment_lower.xml | 37 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 56 insertions(+) diff --git a/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt b/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt index 5e378655c..e71b09263 100644 --- a/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt +++ b/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt @@ -115,6 +115,7 @@ class AlarmDetailsFragment : Fragment() { onCreateRingtoneView() onCreateDeleteOnDismissView() onCreatePrealarmView() + onCreateVibrateView() onCreateBottomView() if (editedAlarm?.isNew == true) { @@ -265,6 +266,23 @@ class AlarmDetailsFragment : Fragment() { .addTo(disposables) } + private fun onCreateVibrateView() { + val mVibrateRow by lazy { + fragmentView.findViewById(R.id.details_vibrate_row) as LinearLayout + } + + val mVibrateCheckBox by lazy { + fragmentView.findViewById(R.id.details_vibration_checkbox) as CheckBox + } + + // pre-alarm + mVibrateRow.setOnClickListener { + modify("Vibrate") { value -> value.copy(isVibrate = !value.isVibrate, isEnabled = true) } + } + + observeEditor { value -> mVibrateCheckBox.isChecked = value.isVibrate } + } + private fun onCreateRingtoneView() { fragmentView.findViewById(R.id.details_ringtone_row).setOnClickListener { editor.takeFirst { value -> diff --git a/app/src/main/res/layout/details_fragment_lower.xml b/app/src/main/res/layout/details_fragment_lower.xml index 271ca46b0..71dac26bf 100644 --- a/app/src/main/res/layout/details_fragment_lower.xml +++ b/app/src/main/res/layout/details_fragment_lower.xml @@ -151,6 +151,43 @@ + + + + + + + + + + + + + + App default (%s) Permission to set exact alarm time To set an alarm at the exact time, permission to set exact alarm time is required. + Vibrate From 1dda1cf7e6fba4b4397a721277527ab6ecd5a65a Mon Sep 17 00:00:00 2001 From: the_mr17 Date: Sat, 16 Sep 2023 19:20:53 +0530 Subject: [PATCH 2/6] Minor fixes --- .../com/better/alarm/presenter/AlarmDetailsFragment.kt | 8 ++++---- app/src/main/res/layout/details_fragment_lower.xml | 2 +- app/src/main/res/values/strings.xml | 1 - 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt b/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt index e71b09263..e143e11e6 100644 --- a/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt +++ b/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt @@ -267,12 +267,12 @@ class AlarmDetailsFragment : Fragment() { } private fun onCreateVibrateView() { - val mVibrateRow by lazy { - fragmentView.findViewById(R.id.details_vibrate_row) as LinearLayout - } + val mVibrateRow = + fragmentView.findViewById(R.id.details_vibrate_row) + val mVibrateCheckBox by lazy { - fragmentView.findViewById(R.id.details_vibration_checkbox) as CheckBox + fragmentView.findViewById(R.id.details_vibration_checkbox) } // pre-alarm diff --git a/app/src/main/res/layout/details_fragment_lower.xml b/app/src/main/res/layout/details_fragment_lower.xml index 71dac26bf..b9b2e344f 100644 --- a/app/src/main/res/layout/details_fragment_lower.xml +++ b/app/src/main/res/layout/details_fragment_lower.xml @@ -167,7 +167,7 @@ android:layout_height="match_parent" android:layout_weight="1" android:gravity="center|left" - android:text="@string/vibrate" + android:text="@string/alarm_vibrate" android:textColor="?android:attr/textColorPrimary" android:textAppearance="?android:attr/textAppearanceMedium" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 445b98ed9..adea01ea6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -209,5 +209,4 @@ App default (%s) Permission to set exact alarm time To set an alarm at the exact time, permission to set exact alarm time is required. - Vibrate From e3a56a979942d0d3039b0998ca92a00822f79672 Mon Sep 17 00:00:00 2001 From: the_mr17 Date: Sat, 16 Sep 2023 19:22:11 +0530 Subject: [PATCH 3/6] Removes vibrate preference from settings --- app/src/main/res/xml/preferences.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index a98822ea2..38a005347 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -34,12 +34,6 @@ android:summary="@string/alarm_in_silent_mode_summary" android:title="@string/alarm_in_silent_mode_title" app:iconSpaceReserved="false" /> - - Date: Tue, 19 Sep 2023 10:54:50 +0530 Subject: [PATCH 4/6] Implements new vibrate preference --- .../alarm/background/VibrationPlugin.kt | 9 ++++-- .../com/better/alarm/configuration/Prefs.kt | 28 +++++++++---------- .../alarm/presenter/AlarmDetailsFragment.kt | 27 ++++++++++++++++++ .../alarm/presenter/AlarmsListActivity.kt | 14 +++++++++- .../alarm/presenter/SettingsFragment.kt | 2 ++ app/src/main/res/values/strings.xml | 12 ++++++++ app/src/main/res/xml/preferences.xml | 9 ++++++ 7 files changed, 83 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/better/alarm/background/VibrationPlugin.kt b/app/src/main/java/com/better/alarm/background/VibrationPlugin.kt index 51fc2d983..7bc738bf7 100644 --- a/app/src/main/java/com/better/alarm/background/VibrationPlugin.kt +++ b/app/src/main/java/com/better/alarm/background/VibrationPlugin.kt @@ -20,7 +20,7 @@ class VibrationPlugin( private val vibrator: Vibrator, private val fadeInTimeInMillis: Observable, private val scheduler: Scheduler, - private val vibratePreference: Observable + private val vibratePreference: Observable ) : AlertPlugin { private val vibratePattern: LongArray = longArrayOf(500, 500) private var disposable = Disposables.empty() @@ -35,8 +35,11 @@ class VibrationPlugin( Observable.combineLatest( vibratePreference, targetVolume, - BiFunction { isEnabled, volume -> - if (isEnabled) volume else TargetVolume.MUTED + BiFunction { vibrate, volume -> + when (vibrate) { + "on" -> volume + else -> TargetVolume.MUTED + } }) .distinctUntilChanged() .switchMap { volume -> diff --git a/app/src/main/java/com/better/alarm/configuration/Prefs.kt b/app/src/main/java/com/better/alarm/configuration/Prefs.kt index 1108ba71b..563b48c93 100644 --- a/app/src/main/java/com/better/alarm/configuration/Prefs.kt +++ b/app/src/main/java/com/better/alarm/configuration/Prefs.kt @@ -16,18 +16,18 @@ enum class Layout { class Prefs private constructor( - val is24HourFormat: Single, - val preAlarmDuration: RxDataStore, - val preAlarmVolume: RxDataStore, - val snoozeDuration: RxDataStore, - val listRowLayout: RxDataStore, - val autoSilence: RxDataStore, - val fadeInTimeInSeconds: RxDataStore, - val vibrate: RxDataStore, - val skipDuration: RxDataStore, - val longClickDismiss: RxDataStore, - val theme: RxDataStore, - val defaultRingtone: RxDataStore, + val is24HourFormat: Single, + val preAlarmDuration: RxDataStore, + val preAlarmVolume: RxDataStore, + val snoozeDuration: RxDataStore, + val listRowLayout: RxDataStore, + val autoSilence: RxDataStore, + val fadeInTimeInSeconds: RxDataStore, + val vibrate: RxDataStore, + val skipDuration: RxDataStore, + val longClickDismiss: RxDataStore, + val theme: RxDataStore, + val defaultRingtone: RxDataStore, ) { fun layout(): Layout { return listRowLayout().take(1).blockingFirst() @@ -57,7 +57,7 @@ private constructor( listRowLayout = factory.stringDataStore(LIST_ROW_LAYOUT, LIST_ROW_LAYOUT_BOLD), autoSilence = factory.intStringDataStore(KEY_AUTO_SILENCE, 10), fadeInTimeInSeconds = factory.intStringDataStore(KEY_FADE_IN_TIME_SEC, 30), - vibrate = factory.booleanDataStore(KEY_VIBRATE, true), + vibrate = factory.stringDataStore(KEY_VIBRATE, "on"), skipDuration = factory.intStringDataStore(KEY_SKIP_DURATION, 30), longClickDismiss = factory.booleanDataStore(KEY_LONGCLICK_DISMISS, true), theme = factory.stringDataStore(KEY_THEME, "deusex"), @@ -67,7 +67,7 @@ private constructor( } const val KEY_THEME = "ui_theme" - const val KEY_VIBRATE = "vibrate" + const val KEY_VIBRATE = "ui_vibrate" const val KEY_SKIP_DURATION = "skip_notification_time" const val KEY_ALARM_IN_SILENT_MODE = "alarm_in_silent_mode" const val KEY_ALARM_SNOOZE = "snooze_duration" diff --git a/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt b/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt index e143e11e6..338271dcb 100644 --- a/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt +++ b/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt @@ -28,6 +28,7 @@ import android.widget.CheckBox import android.widget.EditText import android.widget.LinearLayout import android.widget.TextView +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import com.better.alarm.R import com.better.alarm.checkPermissions @@ -270,6 +271,32 @@ class AlarmDetailsFragment : Fragment() { val mVibrateRow = fragmentView.findViewById(R.id.details_vibrate_row) + when(prefs.vibrate.value) { + "alwaysoff" -> { + mVibrateRow.isVisible = false + modify("Vibrate") { + value -> value.copy(isVibrate = false, isEnabled = true) + } + } + "on" -> { + editedAlarmId?.let { + if(alarms.getAlarm(it)?.data?.isEnabled == false) { + modify("Vibrate") { + value -> value.copy(isVibrate = true, isEnabled = true) + } + } + } + } + "off" -> { + editedAlarmId?.let { + if(alarms.getAlarm(it)?.data?.isEnabled == false) { + modify("Vibrate") { + value -> value.copy(isVibrate = false, isEnabled = true) + } + } + } + } + } val mVibrateCheckBox by lazy { fragmentView.findViewById(R.id.details_vibration_checkbox) diff --git a/app/src/main/java/com/better/alarm/presenter/AlarmsListActivity.kt b/app/src/main/java/com/better/alarm/presenter/AlarmsListActivity.kt index 03b99a7bb..807fb3650 100644 --- a/app/src/main/java/com/better/alarm/presenter/AlarmsListActivity.kt +++ b/app/src/main/java/com/better/alarm/presenter/AlarmsListActivity.kt @@ -41,6 +41,7 @@ import com.better.alarm.R import com.better.alarm.checkPermissions import com.better.alarm.configuration.AlarmApplication import com.better.alarm.configuration.EditedAlarm +import com.better.alarm.configuration.Prefs import com.better.alarm.configuration.Store import com.better.alarm.configuration.globalGet import com.better.alarm.configuration.globalInject @@ -84,6 +85,7 @@ class AlarmsListActivity : AppCompatActivity() { class UiStoreIR : UiStore { var onBackPressed = PublishSubject.create() val editing: MutableStateFlow = MutableStateFlow(edited) + private val prefs: Prefs by globalInject() override fun editing(): MutableStateFlow { return editing @@ -94,7 +96,17 @@ class AlarmsListActivity : AppCompatActivity() { } override fun createNewAlarm() { - editing.value = EditedAlarm(isNew = true, value = AlarmValue(isDeleteAfterDismiss = true)) + editing.value = EditedAlarm( + isNew = true, + value = AlarmValue( + isDeleteAfterDismiss = true, + isVibrate = + when(prefs.vibrate.value) { + "on" -> true + else -> false + } + ) + ) } override fun edit(id: Int) { diff --git a/app/src/main/java/com/better/alarm/presenter/SettingsFragment.kt b/app/src/main/java/com/better/alarm/presenter/SettingsFragment.kt index 63d72c7f7..fbe11116f 100644 --- a/app/src/main/java/com/better/alarm/presenter/SettingsFragment.kt +++ b/app/src/main/java/com/better/alarm/presenter/SettingsFragment.kt @@ -155,6 +155,8 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + bindListPreference(Prefs.KEY_VIBRATE, prefs.vibrate) { summary = entry } + bindListPreference(Prefs.KEY_THEME, prefs.theme) { summary = entry } bindListPreference(Prefs.LIST_ROW_LAYOUT, prefs.listRowLayout) { summary = entry } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index adea01ea6..61b6c1572 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,6 +86,18 @@ %1$s, %2$s, and %3$s + Vibration + + Always Off + On (by default) + Off (by default) + + + alwaysoff + on + off + + Interface theme Neon diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 38a005347..10052b74f 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -34,6 +34,15 @@ android:summary="@string/alarm_in_silent_mode_summary" android:title="@string/alarm_in_silent_mode_title" app:iconSpaceReserved="false" /> + + Date: Mon, 25 Sep 2023 14:47:39 +0530 Subject: [PATCH 5/6] Minor fixes --- app/src/main/java/com/better/alarm/configuration/Prefs.kt | 2 +- .../java/com/better/alarm/presenter/AlarmDetailsFragment.kt | 5 ++--- .../java/com/better/alarm/presenter/AlarmsListActivity.kt | 6 +----- app/src/main/res/xml/preferences.xml | 2 +- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/better/alarm/configuration/Prefs.kt b/app/src/main/java/com/better/alarm/configuration/Prefs.kt index 563b48c93..80489e2ec 100644 --- a/app/src/main/java/com/better/alarm/configuration/Prefs.kt +++ b/app/src/main/java/com/better/alarm/configuration/Prefs.kt @@ -67,7 +67,7 @@ private constructor( } const val KEY_THEME = "ui_theme" - const val KEY_VIBRATE = "ui_vibrate" + const val KEY_VIBRATE = "vibrate" const val KEY_SKIP_DURATION = "skip_notification_time" const val KEY_ALARM_IN_SILENT_MODE = "alarm_in_silent_mode" const val KEY_ALARM_SNOOZE = "snooze_duration" diff --git a/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt b/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt index 338271dcb..52db311e1 100644 --- a/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt +++ b/app/src/main/java/com/better/alarm/presenter/AlarmDetailsFragment.kt @@ -298,9 +298,8 @@ class AlarmDetailsFragment : Fragment() { } } - val mVibrateCheckBox by lazy { - fragmentView.findViewById(R.id.details_vibration_checkbox) - } + val mVibrateCheckBox = + fragmentView.findViewById(R.id.details_vibration_checkbox) // pre-alarm mVibrateRow.setOnClickListener { diff --git a/app/src/main/java/com/better/alarm/presenter/AlarmsListActivity.kt b/app/src/main/java/com/better/alarm/presenter/AlarmsListActivity.kt index 807fb3650..f3e67ccd3 100644 --- a/app/src/main/java/com/better/alarm/presenter/AlarmsListActivity.kt +++ b/app/src/main/java/com/better/alarm/presenter/AlarmsListActivity.kt @@ -100,11 +100,7 @@ class AlarmsListActivity : AppCompatActivity() { isNew = true, value = AlarmValue( isDeleteAfterDismiss = true, - isVibrate = - when(prefs.vibrate.value) { - "on" -> true - else -> false - } + isVibrate = prefs.vibrate.value == "on" ) ) } diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 10052b74f..3e3ed169f 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -40,7 +40,7 @@ android:dialogTitle="@string/vibration_title" android:entries="@array/vibration_entries" android:entryValues="@array/vibration_values" - android:key="ui_vibrate" + android:key="vibrate" android:title="@string/vibration_title" app:iconSpaceReserved="false" /> From 003433cc9fd36602ccc21d03909a823df5678fd6 Mon Sep 17 00:00:00 2001 From: the_mr17 Date: Mon, 25 Sep 2023 14:58:14 +0530 Subject: [PATCH 6/6] Adds translations --- app/src/main/res/values-de/strings.xml | 6 ++++++ app/src/main/res/values-es/strings.xml | 7 ++++++- app/src/main/res/values-it/strings.xml | 6 ++++++ app/src/main/res/values-nb/strings.xml | 7 ++++++- app/src/main/res/values-ru/strings.xml | 6 ++++++ app/src/main/res/values-uk/strings.xml | 6 ++++++ app/src/main/res/values-zh-rCN/strings.xml | 7 ++++++- 7 files changed, 42 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index e2204533f..48138976e 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -56,6 +56,12 @@ "%2$s und %3$s" "%1$s, %2$s und %3$s." + Vibration + + Standardmäßig eingeschaltet + Standardmäßig ausgeschaltet + Deaktiviert + Oberfläche Zeilengröße diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 195345fb2..e08a842f3 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -65,7 +65,12 @@ %2$s and %3$s %1$s, %2$s, and %3$s - + Vibración + + Activada por defecto + Desactivada por defecto + Desactivada + Gama de colores Compacto diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 44b391604..9106603b0 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -63,6 +63,12 @@ %2$s e %3$s %1$s, %2$s, e %3$s + Vibrazione + + Attivata per impostazione predefinita + Disattivata per impostazione predefinita + Disabilitata + Tema dell\'interfaccia Sveglia Semplice diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 8444f0037..4d918d1e2 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -65,7 +65,12 @@ %2$s og %3$s %1$s, %2$s, og %3$s - + Vibrasjon + + På som standard + Av som standard + Deaktivert + Brukerflatetema Neon diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index c401929dc..d2ca4b6cc 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -56,6 +56,12 @@ "%2$s и %3$s" "%1$s, %2$s и %3$s" + Вибрация + + Включено по умолчанию + Отключено по умолчанию + Отключено + Цветовая гамма Компактный diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 8579d2a45..0f47336ce 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -41,6 +41,12 @@ "%2$s и %3$s" "%1$s, %2$s и %3$s" + Вібрація + + Увімкнено за замовчуванням + Вимкнено за замовчуванням + Вимкнено + Кольорова гамма Компактний diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 58016371c..964cb2371 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -84,7 +84,12 @@ %2$s %3$s %1$s %2$s %3$s - + 振动 + + 默认开启 + 默认关闭 + 禁用 + 界面主题 Neon