A fork of Simple Time Tracker with WearOS support. (Now integrated upstream)
0

Configure Feed

Select the types of activity you want to include in your feed.

add system dark mode

razeeman (Jul 1, 2023, 4:22 PM +0300) 4175b211 2bf3e16d

+210 -36
+2
core/src/main/res/values-ca/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">No enregistra les activitats més curtes que el temps especificat.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Desactivat</string> 226 226 <string name="settings_dark_mode">Mode fosc</string> 227 + <string name="settings_dark_mode_system">Sistema</string> 228 + <string name="settings_dark_mode_enabled">Habilitat</string> 227 229 <string name="settings_use_military_time">Utilitza el format 24-hores</string> 228 230 <string name="settings_use_proportional_minutes">Utilitza formar de minut proporcional</string> 229 231 <string name="settings_show_seconds">Mostra segons</string>
+2
core/src/main/res/values-de/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Verfolgen Sie keine Aktivitäten, die kürzer als die angegebene Zeit sind.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Deaktiviert</string> 226 226 <string name="settings_dark_mode">Dunkler Modus</string> 227 + <string name="settings_dark_mode_system">System</string> 228 + <string name="settings_dark_mode_enabled">Ermöglicht</string> 227 229 <string name="settings_use_military_time">24-Stunden-Format benutzen</string> 228 230 <string name="settings_use_proportional_minutes">Proportionales Minutenformat verwenden</string> 229 231 <string name="settings_show_seconds">Sekunden anzeigen</string>
+2
core/src/main/res/values-es/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">No rastree actividades que sean más cortas que el tiempo especificado.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Deshabilitado</string> 226 226 <string name="settings_dark_mode">Tema oscuro</string> 227 + <string name="settings_dark_mode_system">Sistema</string> 228 + <string name="settings_dark_mode_enabled">Activado</string> 227 229 <string name="settings_use_military_time">Usar el formato 24-horas</string> 228 230 <string name="settings_use_proportional_minutes">Usar el formato de minuto proporcional</string> 229 231 <string name="settings_show_seconds">Mostrar segundos</string>
+2
core/src/main/res/values-fa/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">فعالیت هایی که از زمان معین شده کوتاه تر هستند را اندازه گیری نکن</string> 225 225 <string name="settings_inactivity_reminder_disabled">غیر فعال</string> 226 226 <string name="settings_dark_mode">تم تیره</string> 227 + <string name="settings_dark_mode_system">سیستم</string> 228 + <string name="settings_dark_mode_enabled">فعال شد</string> 227 229 <string name="settings_use_military_time">استفاده از فرمت 24 ساعته</string> 228 230 <string name="settings_use_proportional_minutes">از زمان دقایق نسبی استفاده کن</string> 229 231 <string name="settings_show_seconds">نمایش ثانیه ها</string>
+2
core/src/main/res/values-fr/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Ne pas enregistrer les activités qui sont plus courtes que la durée spécifiée.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Désactivé</string> 226 226 <string name="settings_dark_mode">Mode sombre</string> 227 + <string name="settings_dark_mode_system">Système</string> 228 + <string name="settings_dark_mode_enabled">Activé</string> 227 229 <string name="settings_use_military_time">Utiliser le format 24 heures</string> 228 230 <string name="settings_use_proportional_minutes">Utiliser le format décimal</string> 229 231 <string name="settings_show_seconds">Afficher les secondes</string>
+2
core/src/main/res/values-hi/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">उन गतिविधियों को ट्रैक न करें जो निर्दिष्ट समय से कम हैं।</string> 225 225 <string name="settings_inactivity_reminder_disabled">अक्षम</string> 226 226 <string name="settings_dark_mode">रात्रि मोड</string> 227 + <string name="settings_dark_mode_system">प्रणाली</string> 228 + <string name="settings_dark_mode_enabled">सक्रिय</string> 227 229 <string name="settings_use_military_time">24-घंटे के प्रारूप का उपयोग करें</string> 228 230 <string name="settings_use_proportional_minutes">आनुपातिक मिनट प्रारूप का उपयोग करें</string> 229 231 <string name="settings_show_seconds">सेकंड दिखाएँ</string>
+2
core/src/main/res/values-in/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Jangan melacak aktivitas yang lebih pendek dari waktu yang ditentukan.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Dinonaktifkan</string> 226 226 <string name="settings_dark_mode">Mode gelap</string> 227 + <string name="settings_dark_mode_system">Sistem</string> 228 + <string name="settings_dark_mode_enabled">Diaktifkan</string> 227 229 <string name="settings_use_military_time">Pakai format 24-jam</string> 228 230 <string name="settings_use_proportional_minutes">Gunakan format minit berkadar</string> 229 231 <string name="settings_show_seconds">Tampilkan detik</string>
+2
core/src/main/res/values-it/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Non tenere traccia delle attività più brevi del tempo specificato.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Disabilitato</string> 226 226 <string name="settings_dark_mode">Modalità notte</string> 227 + <string name="settings_dark_mode_system">Sistema</string> 228 + <string name="settings_dark_mode_enabled">Abilitato</string> 227 229 <string name="settings_use_military_time">Use il formato a 24 ore</string> 228 230 <string name="settings_use_proportional_minutes">Usa il formato a minuti proporzionali</string> 229 231 <string name="settings_show_seconds">Mostra secondi</string>
+2
core/src/main/res/values-ja/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">指定された時間より短いアクティビティは計測しません。</string> 225 225 <string name="settings_inactivity_reminder_disabled">未設定</string> 226 226 <string name="settings_dark_mode">ダークモード</string> 227 + <string name="settings_dark_mode_system">システム</string> 228 + <string name="settings_dark_mode_enabled">有効</string> 227 229 <string name="settings_use_military_time">24時間制で表示</string> 228 230 <string name="settings_use_proportional_minutes">時間表示の変更</string> 229 231 <string name="settings_show_seconds">秒を表示</string>
+2
core/src/main/res/values-nl/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Houd geen activiteiten bij die korter zijn dan de opgegeven tijd.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Uitgeschakeld</string> 226 226 <string name="settings_dark_mode">Donkere modus</string> 227 + <string name="settings_dark_mode_system">Systeem</string> 228 + <string name="settings_dark_mode_enabled">Ingeschakeld</string> 227 229 <string name="settings_use_military_time">Gebruik 24-uurs formaat</string> 228 230 <string name="settings_use_proportional_minutes">Gebruik proportioneel minutenformaat</string> 229 231 <string name="settings_show_seconds">Toon seconden</string>
+2
core/src/main/res/values-pt/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Não rastreie atividades mais curtas que o tempo especificado.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Desativado</string> 226 226 <string name="settings_dark_mode">Modo noturno</string> 227 + <string name="settings_dark_mode_system">Sistema</string> 228 + <string name="settings_dark_mode_enabled">Habilitado</string> 227 229 <string name="settings_use_military_time">Usar formato de 24 horas</string> 228 230 <string name="settings_use_proportional_minutes">Usar o formato de minuto proporcional</string> 229 231 <string name="settings_show_seconds">Mostrar segundos</string>
+2
core/src/main/res/values-ru/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Не отслеживать активности, которые короче указанного времени.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Выкл.</string> 226 226 <string name="settings_dark_mode">Темный режим</string> 227 + <string name="settings_dark_mode_system">Система</string> 228 + <string name="settings_dark_mode_enabled">Вкл.</string> 227 229 <string name="settings_use_military_time">24-часовой формат</string> 228 230 <string name="settings_use_proportional_minutes">Использовать пропорциональный минутный формат</string> 229 231 <string name="settings_show_seconds">Показать секунды</string>
+2
core/src/main/res/values-sv/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Ignorera händelser som är kortare än den angivna tidslängden.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Inaktiverad</string> 226 226 <string name="settings_dark_mode">Mörkt läge</string> 227 + <string name="settings_dark_mode_system">Systemet</string> 228 + <string name="settings_dark_mode_enabled">Aktiverad</string> 227 229 <string name="settings_use_military_time">Använd 24-timmarsklocka</string> 228 230 <string name="settings_use_proportional_minutes">Använd decimaltal för tid</string> 229 231 <string name="settings_show_seconds">Visa sekunder</string>
+2
core/src/main/res/values-tr/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Belirtilen süreden daha kısa olan kayıtları yoksay.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Devre dışı</string> 226 226 <string name="settings_dark_mode">Karanlık mod</string> 227 + <string name="settings_dark_mode_system">Sistem</string> 228 + <string name="settings_dark_mode_enabled">Etkinleştirilmiş</string> 227 229 <string name="settings_use_military_time">24-saat formatını kullan</string> 228 230 <string name="settings_use_proportional_minutes">Oransal dakika formatını kullan</string> 229 231 <string name="settings_show_seconds">Saniye göster</string>
+2
core/src/main/res/values-uk/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Не відстежуйте дії, які коротші за вказаний час.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Вимкнено</string> 226 226 <string name="settings_dark_mode">Темний режим</string> 227 + <string name="settings_dark_mode_system">Система</string> 228 + <string name="settings_dark_mode_enabled">Увімкнено</string> 227 229 <string name="settings_use_military_time">Використовувати 24-годинний формат</string> 228 230 <string name="settings_use_proportional_minutes">Використовуйте пропорційний хвилинний формат</string> 229 231 <string name="settings_show_seconds">Показати секунди</string>
+2
core/src/main/res/values-zh-rTW/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">短於指定時間,不要追蹤活動</string> 225 225 <string name="settings_inactivity_reminder_disabled">已關閉</string> 226 226 <string name="settings_dark_mode">暗黑模式</string> 227 + <string name="settings_dark_mode_system">系統</string> 228 + <string name="settings_dark_mode_enabled">啟用</string> 227 229 <string name="settings_use_military_time">使用 24 小時格式</string> 228 230 <string name="settings_use_proportional_minutes">使用比例分鐘格式</string> 229 231 <string name="settings_show_seconds">顯示秒數</string>
+2
core/src/main/res/values-zh/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">不要跟踪短于指定时间的活动。</string> 225 225 <string name="settings_inactivity_reminder_disabled">不启用</string> 226 226 <string name="settings_dark_mode">深色模式</string> 227 + <string name="settings_dark_mode_system">系统</string> 228 + <string name="settings_dark_mode_enabled">启用</string> 227 229 <string name="settings_use_military_time">使用24小时格式</string> 228 230 <string name="settings_use_proportional_minutes">使用比例分钟格式</string> 229 231 <string name="settings_show_seconds">显示秒数</string>
+2
core/src/main/res/values/strings.xml
··· 224 224 <string name="settings_ignore_short_records_hint">Do not track activities that are shorter than the specified time.</string> 225 225 <string name="settings_inactivity_reminder_disabled">Disabled</string> 226 226 <string name="settings_dark_mode">Dark mode</string> 227 + <string name="settings_dark_mode_system">System</string> 228 + <string name="settings_dark_mode_enabled">Enabled</string> 227 229 <string name="settings_use_military_time">Use 24-hour format</string> 228 230 <string name="settings_use_proportional_minutes">Use proportional minute format</string> 229 231 <string name="settings_show_seconds">Show seconds</string>
+19 -3
features/feature_settings/src/main/res/layout/settings_main_layout.xml
··· 1 1 <?xml version="1.0" encoding="utf-8"?> 2 2 <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 3 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 + xmlns:tools="http://schemas.android.com/tools" 4 5 style="@style/SettingsCard" 5 6 android:layout_width="match_parent" 6 7 android:layout_height="wrap_content"> ··· 62 63 android:layout_width="0dp" 63 64 android:layout_height="wrap_content" 64 65 android:text="@string/settings_dark_mode" 65 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsDarkMode" 66 + app:layout_constraintEnd_toStartOf="@id/tvSettingsDarkModeValue" 66 67 app:layout_constraintStart_toStartOf="parent" 67 68 app:layout_constraintTop_toTopOf="parent" /> 68 69 69 - <androidx.appcompat.widget.AppCompatCheckBox 70 - android:id="@+id/checkboxSettingsDarkMode" 70 + <androidx.appcompat.widget.AppCompatTextView 71 + android:id="@+id/tvSettingsDarkModeValue" 71 72 android:layout_width="wrap_content" 72 73 android:layout_height="0dp" 74 + android:layout_marginEnd="32dp" 75 + android:gravity="end|center_vertical" 76 + android:paddingStart="8dp" 77 + android:paddingEnd="8dp" 78 + android:textColor="?appTextPrimaryColor" 79 + app:layout_constraintBottom_toBottomOf="@id/spinnerSettingsDarkMode" 80 + app:layout_constraintEnd_toEndOf="@id/spinnerSettingsDarkMode" 81 + app:layout_constraintTop_toTopOf="@id/spinnerSettingsDarkMode" 82 + tools:text="@string/settings_dark_mode_system" /> 83 + 84 + <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 85 + android:id="@+id/spinnerSettingsDarkMode" 86 + android:layout_width="wrap_content" 87 + android:layout_height="0dp" 88 + android:layout_marginEnd="8dp" 73 89 app:layout_constraintBottom_toBottomOf="@id/tvSettingsDarkMode" 74 90 app:layout_constraintEnd_toEndOf="parent" 75 91 app:layout_constraintTop_toTopOf="@id/tvSettingsDarkMode" />
+3 -1
features/feature_views/src/main/res/values/styles.xml
··· 1 1 <?xml version="1.0" encoding="utf-8"?> 2 - <resources> 2 + <resources xmlns:tools="http://schemas.android.com/tools"> 3 3 4 4 <style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar"> 5 5 <item name="colorPrimary">@color/colorPrimary</item> ··· 11 11 <item name="snackbarButtonStyle">@style/AppTheme.SnackbarButton</item> 12 12 <item name="alertDialogTheme">@style/AppTheme.Dialog</item> 13 13 <item name="android:windowBackground">@color/colorBackground</item> 14 + <item name="android:forceDarkAllowed" tools:targetApi="q">false</item> 14 15 15 16 <item name="appContrastColor">@color/black</item> 16 17 <item name="appTextPrimaryColor">@color/textPrimary</item> ··· 53 54 <item name="snackbarButtonStyle">@style/AppTheme.SnackbarButton</item> 54 55 <item name="alertDialogTheme">@style/AppTheme.Dialog.Dark</item> 55 56 <item name="android:windowBackground">@color/colorBackgroundDark</item> 57 + <item name="android:forceDarkAllowed" tools:targetApi="q">false</item> 56 58 57 59 <item name="appContrastColor">@color/white</item> 58 60 <item name="appTextPrimaryColor">@color/textPrimaryDark</item>
+6
app/src/main/java/com/example/util/simpletimetracker/di/AppModuleBinds.kt
··· 1 1 package com.example.util.simpletimetracker.di 2 2 3 + import com.example.util.simpletimetracker.core.interactor.IsSystemInInDarkModeInteractorImpl 3 4 import com.example.util.simpletimetracker.core.interactor.GetUntrackedRecordsInteractorImpl 4 5 import com.example.util.simpletimetracker.core.mapper.AppColorMapperImpl 5 6 import com.example.util.simpletimetracker.core.provider.ApplicationDataProvider 7 + import com.example.util.simpletimetracker.domain.interactor.IsSystemInDarkModeInteractor 6 8 import com.example.util.simpletimetracker.domain.interactor.GetUntrackedRecordsInteractor 7 9 import com.example.util.simpletimetracker.domain.mapper.AppColorMapper 8 10 import com.example.util.simpletimetracker.provider.ApplicationDataProviderImpl ··· 27 29 @Binds 28 30 @Singleton 29 31 fun GetUntrackedRecordsInteractorImpl.bindGetUntrackedRecordsInteractor(): GetUntrackedRecordsInteractor 32 + 33 + @Binds 34 + @Singleton 35 + fun IsSystemInInDarkModeInteractorImpl.bindIsSystemInDarkModeInteractor(): IsSystemInDarkModeInteractor 30 36 }
+23
core/src/main/java/com/example/util/simpletimetracker/core/interactor/IsSystemInInDarkModeInteractorImpl.kt
··· 1 + package com.example.util.simpletimetracker.core.interactor 2 + 3 + import android.content.Context 4 + import android.content.res.Configuration 5 + import com.example.util.simpletimetracker.domain.interactor.IsSystemInDarkModeInteractor 6 + import dagger.hilt.android.qualifiers.ApplicationContext 7 + import javax.inject.Inject 8 + 9 + class IsSystemInInDarkModeInteractorImpl @Inject constructor( 10 + @ApplicationContext private val context: Context, 11 + ) : IsSystemInDarkModeInteractor { 12 + 13 + override fun execute(): Boolean { 14 + val configuration = context.resources.configuration 15 + 16 + return when (configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) { 17 + Configuration.UI_MODE_NIGHT_YES -> true 18 + Configuration.UI_MODE_NIGHT_NO -> false 19 + Configuration.UI_MODE_NIGHT_UNDEFINED -> false 20 + else -> false 21 + } 22 + } 23 + }
+5 -4
data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/PrefsRepoImpl.kt
··· 161 161 KEY_UNTRACKED_RANGE_END, 0 162 162 ) 163 163 164 - override var darkMode: Boolean by prefs.delegate( 165 - KEY_DARK_MODE, false 164 + override var darkMode: Int by prefs.delegate( 165 + KEY_DARK_MODE_2, 0 166 166 ) 167 167 168 168 override var numberOfCards: Int by prefs.delegate( ··· 357 357 prefs.edit().clear().apply() 358 358 } 359 359 360 + @Suppress("unused") 360 361 companion object { 361 362 private const val DO_NOT_DISTURB_PERIOD_START: Long = 0 // midnight 362 363 private const val DO_NOT_DISTURB_PERIOD_END: Long = 1000 * 60 * 60 * 8 // 8 hours in the morning ··· 397 398 private const val KEY_UNTRACKED_RANGE_ENABLED = "untrackedRangeEnabled" 398 399 private const val KEY_UNTRACKED_RANGE_START = "untrackedRangeStart" 399 400 private const val KEY_UNTRACKED_RANGE_END = "untrackedRangeEnd" 400 - private const val KEY_DARK_MODE = "darkMode" 401 + private const val KEY_DARK_MODE_2 = "darkMode2" 401 402 private const val KEY_NUMBER_OF_CARDS = "numberOfCards" // 0 - default width 402 403 private const val KEY_USE_MILITARY_TIME_FORMAT = "useMilitaryTimeFormat" 403 404 private const val KEY_USE_PROPORTIONAL_MINUTES = "useProportionalMinutes" ··· 423 424 private const val KEY_CARD_ORDER_MANUAL = "cardOrderManual" 424 425 425 426 // Removed 426 - @Suppress("unused") 427 427 private const val KEY_SORT_RECORD_TYPES_BY_COLOR = "sortRecordTypesByColor" // Boolean 428 + private const val KEY_DARK_MODE = "darkMode" 428 429 } 429 430 }
+7
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/DarkMode.kt
··· 1 + package com.example.util.simpletimetracker.domain.interactor 2 + 3 + sealed interface DarkMode { 4 + object System : DarkMode 5 + object Enabled : DarkMode 6 + object Disabled : DarkMode 7 + }
+6
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/IsSystemInDarkModeInteractor.kt
··· 1 + package com.example.util.simpletimetracker.domain.interactor 2 + 3 + interface IsSystemInDarkModeInteractor { 4 + 5 + fun execute(): Boolean 6 + }
+22 -4
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/PrefsInteractor.kt
··· 15 15 16 16 class PrefsInteractor @Inject constructor( 17 17 private val prefsRepo: PrefsRepo, 18 + private val isSystemInDarkModeInteractor: IsSystemInDarkModeInteractor, 18 19 ) { 19 20 20 21 suspend fun getFilteredTypes(): List<Long> = withContext(Dispatchers.IO) { ··· 329 330 prefsRepo.untrackedRangeEnd = end 330 331 } 331 332 332 - suspend fun getDarkMode(): Boolean = withContext(Dispatchers.IO) { 333 - prefsRepo.darkMode 333 + suspend fun getSelectedDarkMode(): DarkMode = withContext(Dispatchers.IO) { 334 + when (prefsRepo.darkMode) { 335 + 0 -> DarkMode.System 336 + 1 -> DarkMode.Enabled 337 + 2 -> DarkMode.Disabled 338 + else -> DarkMode.System 339 + } 334 340 } 335 341 336 - suspend fun setDarkMode(isEnabled: Boolean) = withContext(Dispatchers.IO) { 337 - prefsRepo.darkMode = isEnabled 342 + suspend fun getDarkMode(): Boolean = withContext(Dispatchers.IO) { 343 + when (getSelectedDarkMode()) { 344 + DarkMode.Enabled -> true 345 + DarkMode.Disabled -> false 346 + DarkMode.System -> isSystemInDarkModeInteractor.execute() 347 + } 348 + } 349 + 350 + suspend fun setDarkMode(mode: DarkMode) = withContext(Dispatchers.IO) { 351 + prefsRepo.darkMode = when (mode) { 352 + DarkMode.System -> 0 353 + DarkMode.Enabled -> 1 354 + DarkMode.Disabled -> 2 355 + } 338 356 } 339 357 340 358 suspend fun getNumberOfCards(): Int = withContext(Dispatchers.IO) {
+1 -1
domain/src/main/java/com/example/util/simpletimetracker/domain/repo/PrefsRepo.kt
··· 71 71 72 72 var untrackedRangeEnd: Long // in milliseconds 73 73 74 - var darkMode: Boolean 74 + var darkMode: Int 75 75 76 76 var numberOfCards: Int 77 77
+31
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt
··· 15 15 import com.example.util.simpletimetracker.core.utils.EXTRA_RECORD_COMMENT 16 16 import com.example.util.simpletimetracker.core.utils.EXTRA_RECORD_TAG_NAME 17 17 import com.example.util.simpletimetracker.domain.extension.orZero 18 + import com.example.util.simpletimetracker.domain.interactor.DarkMode 18 19 import com.example.util.simpletimetracker.domain.model.CardOrder 19 20 import com.example.util.simpletimetracker.domain.model.DayOfWeek 20 21 import com.example.util.simpletimetracker.domain.model.DaysInCalendar 21 22 import com.example.util.simpletimetracker.domain.model.count 22 23 import com.example.util.simpletimetracker.feature_settings.R 23 24 import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 25 + import com.example.util.simpletimetracker.feature_settings.viewData.DarkModeViewData 24 26 import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 25 27 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 26 28 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData ··· 58 60 DayOfWeek.FRIDAY, 59 61 DayOfWeek.SATURDAY, 60 62 DayOfWeek.SUNDAY 63 + ) 64 + 65 + private val darkModeList: List<DarkMode> = listOf( 66 + DarkMode.System, 67 + DarkMode.Enabled, 68 + DarkMode.Disabled, 61 69 ) 62 70 63 71 fun toAutomatedTrackingHelpDialog(): HelpDialogParams { ··· 127 135 128 136 fun toDayOfWeek(position: Int): DayOfWeek { 129 137 return dayOfWeekList.getOrElse(position) { dayOfWeekList.first() } 138 + } 139 + 140 + fun toDarkModeViewData(currentMode: DarkMode): DarkModeViewData { 141 + return DarkModeViewData( 142 + items = darkModeList 143 + .map { 144 + when (it) { 145 + DarkMode.System -> resourceRepo.getString(R.string.settings_dark_mode_system) 146 + DarkMode.Enabled -> resourceRepo.getString(R.string.settings_dark_mode_enabled) 147 + DarkMode.Disabled -> resourceRepo.getString(R.string.settings_inactivity_reminder_disabled) 148 + } 149 + } 150 + .map(CustomSpinner::CustomSpinnerTextItem), 151 + selectedPosition = toPosition(currentMode) 152 + ) 153 + } 154 + 155 + fun toDarkMode(position: Int): DarkMode { 156 + return darkModeList.getOrNull(position) ?: darkModeList.first() 130 157 } 131 158 132 159 fun toDurationViewData(duration: Long): SettingsDurationViewData { ··· 223 250 224 251 private fun toPosition(dayOfWeek: DayOfWeek): Int { 225 252 return dayOfWeekList.indexOf(dayOfWeek).takeUnless { it == -1 }.orZero() 253 + } 254 + 255 + private fun toPosition(darkMode: DarkMode): Int { 256 + return darkModeList.indexOf(darkMode).takeUnless { it == -1 }.orZero() 226 257 } 227 258 }
+21 -10
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 15 15 import com.example.util.simpletimetracker.core.sharedViewModel.BackupViewModel 16 16 import com.example.util.simpletimetracker.core.sharedViewModel.MainTabsViewModel 17 17 import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 18 + import com.example.util.simpletimetracker.feature_settings.viewData.DarkModeViewData 18 19 import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 19 20 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 20 21 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData ··· 56 57 ) 57 58 58 59 override fun initUi() = with(binding) { 60 + with(layoutSettingsMain) { 61 + spinnerSettingsDarkMode.setProcessSameItemSelection(false) 62 + } 59 63 with(layoutSettingsDisplay) { 60 64 spinnerSettingsDaysInCalendar.setProcessSameItemSelection(false) 61 65 spinnerSettingsRecordTypeSort.setProcessSameItemSelection(false) ··· 68 72 override fun initUx() = with(binding) { 69 73 with(layoutSettingsMain) { 70 74 checkboxSettingsAllowMultitasking.setOnClick(viewModel::onAllowMultitaskingClicked) 71 - checkboxSettingsDarkMode.setOnClick(viewModel::onDarkModeClicked) 75 + spinnerSettingsDarkMode.onPositionSelected = viewModel::onDarkModeSelected 72 76 layoutSettingsEditCategories.setOnClick(throttle(viewModel::onEditCategoriesClick)) 73 77 tvSettingsArchive.setOnClick(throttle(viewModel::onArchiveClick)) 74 78 tvSettingsDataEdit.setOnClick(throttle(viewModel::onDataEditClick)) ··· 139 143 with(viewModel) { 140 144 with(layoutSettingsMain) { 141 145 allowMultitaskingCheckbox.observe(checkboxSettingsAllowMultitasking::setChecked) 142 - darkModeCheckbox.observe(checkboxSettingsDarkMode::setChecked) 146 + darkModeViewData.observe(::updateDarkModeViewData) 143 147 } 144 148 with(layoutSettingsNotifications) { 145 149 settingsNotificationsVisibility.observe { opened -> ··· 167 171 ignoreShortUntrackedViewData.observe(tvSettingsIgnoreShortUntrackedTime::setText) 168 172 untrackedRangeViewData.observe(::setUntrackedRangeViewData) 169 173 showRecordsCalendarCheckbox.observe(::updateShowRecordCalendarChecked) 174 + daysInCalendarViewData.observe(::updateDaysInCalendarViewData) 170 175 reverseOrderInCalendarCheckbox.observe(checkboxSettingsReverseOrderInCalendar::setChecked) 171 176 showActivityFiltersCheckbox.observe(checkboxSettingsShowActivityFilters::setChecked) 172 177 useMilitaryTimeCheckbox.observe(checkboxSettingsUseMilitaryTime::setChecked) ··· 174 179 showSecondsCheckbox.observe(checkboxSettingsShowSeconds::setChecked) 175 180 useMilitaryTimeHint.observe(tvSettingsUseMilitaryTimeHint::setText) 176 181 useProportionalMinutesHint.observe(tvSettingsUseProportionalMinutesHint::setText) 182 + cardOrderViewData.observe(::updateCardOrderViewData) 183 + keepScreenOnCheckbox.observe(::setKeepScreenOn) 177 184 } 178 185 with(layoutSettingsAdditional) { 179 186 settingsAdditionalVisibility.observe { opened -> ··· 185 192 recordTagSelectionCloseCheckbox.observe(checkboxSettingsRecordTagSelectionClose::setChecked) 186 193 recordTagSelectionForGeneralTagsCheckbox.observe(checkboxSettingsRecordTagSelectionGeneral::setChecked) 187 194 automatedTrackingSendEventsCheckbox.observe(checkboxSettingsAutomatedTrackingSend::setChecked) 195 + firstDayOfWeekViewData.observe(::updateFirstDayOfWeekViewData) 196 + startOfDayViewData.observe(::updateStartOfDayViewData) 197 + showRecordTagSelectionCheckbox.observe(::updateShowRecordTagSelectionChecked) 188 198 } 189 199 with(layoutSettingsRating) { 190 200 versionName.observe(tvSettingsVersionName::setText) 191 201 } 192 - cardOrderViewData.observe(::updateCardOrderViewData) 193 - daysInCalendarViewData.observe(::updateDaysInCalendarViewData) 194 - firstDayOfWeekViewData.observe(::updateFirstDayOfWeekViewData) 195 - startOfDayViewData.observe(::updateStartOfDayViewData) 196 - keepScreenOnCheckbox.observe(::setKeepScreenOn) 197 - showRecordTagSelectionCheckbox.observe(::updateShowRecordTagSelectionChecked) 198 202 themeChanged.observe(::changeTheme) 199 203 resetScreen.observe { 200 204 containerSettings.smoothScrollTo(0, 0) ··· 228 232 super.onResume() 229 233 with(layoutSettingsMain) { 230 234 checkboxSettingsAllowMultitasking.jumpDrawablesToCurrentState() 231 - checkboxSettingsDarkMode.jumpDrawablesToCurrentState() 235 + spinnerSettingsDarkMode.jumpDrawablesToCurrentState() 232 236 } 233 237 with(layoutSettingsNotifications) { 234 238 checkboxSettingsShowNotifications.jumpDrawablesToCurrentState() ··· 309 313 .getOrNull(viewData.selectedPosition)?.text.orEmpty() 310 314 } 311 315 316 + private fun updateDarkModeViewData( 317 + viewData: DarkModeViewData, 318 + ) = with(binding.layoutSettingsMain) { 319 + spinnerSettingsDarkMode.setData(viewData.items, viewData.selectedPosition) 320 + tvSettingsDarkModeValue.text = viewData.items 321 + .getOrNull(viewData.selectedPosition)?.text.orEmpty() 322 + } 323 + 312 324 private fun updateShowRecordTagSelectionChecked( 313 325 isChecked: Boolean, 314 326 ) = with(binding.layoutSettingsAdditional) { ··· 375 387 376 388 private fun changeTheme(themeChanged: Boolean) { 377 389 if (themeChanged) { 378 - viewModel.onThemeChanged() 379 390 activity?.recreate() 380 391 // TODO fix fade and save scroll 381 392 activity?.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out)
+8
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewData/DarkModeViewData.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.viewData 2 + 3 + import com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 4 + 5 + data class DarkModeViewData( 6 + val items: List<CustomSpinner.CustomSpinnerItem>, 7 + val selectedPosition: Int 8 + )
+22 -13
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt
··· 24 24 import com.example.util.simpletimetracker.feature_settings.R 25 25 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 26 26 import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 27 + import com.example.util.simpletimetracker.feature_settings.viewData.DarkModeViewData 27 28 import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 28 29 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 29 30 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData ··· 276 277 } 277 278 } 278 279 279 - val darkModeCheckbox: LiveData<Boolean> by lazy { 280 - MutableLiveData<Boolean>().let { initial -> 280 + val darkModeViewData: LiveData<DarkModeViewData> by lazy { 281 + MutableLiveData<DarkModeViewData>().let { initial -> 281 282 viewModelScope.launch { 282 - initial.value = prefsInteractor.getDarkMode() 283 + initial.value = loadDarkModeViewData() 283 284 } 284 285 initial 285 286 } ··· 379 380 MutableLiveData(loadVersionName()) 380 381 } 381 382 382 - val themeChanged: LiveData<Boolean> = MutableLiveData(false) 383 + val themeChanged: SingleLiveEvent<Boolean> = SingleLiveEvent() 383 384 val settingsNotificationsVisibility: LiveData<Boolean> = MutableLiveData(false) 384 385 val settingsDisplayVisibility: LiveData<Boolean> = MutableLiveData(false) 385 386 val settingsAdditionalVisibility: LiveData<Boolean> = MutableLiveData(false) ··· 684 685 } 685 686 } 686 687 687 - fun onDarkModeClicked() { 688 + fun onDarkModeSelected(position: Int) { 688 689 viewModelScope.launch { 689 - val newValue = !prefsInteractor.getDarkMode() 690 - prefsInteractor.setDarkMode(newValue) 691 - (darkModeCheckbox as MutableLiveData).value = newValue 692 - (themeChanged as MutableLiveData).value = true 690 + val currentMode = prefsInteractor.getSelectedDarkMode() 691 + val newMode = settingsMapper.toDarkMode(position) 692 + if (newMode == currentMode) return@launch 693 + 694 + prefsInteractor.setDarkMode(newMode) 695 + updateDarkModeViewData() 696 + themeChanged.set(true) 693 697 } 694 698 } 695 699 ··· 890 894 } 891 895 } 892 896 893 - fun onThemeChanged() { 894 - (themeChanged as MutableLiveData).value = false 895 - } 896 - 897 897 fun onAutomatedTrackingHelpClick() { 898 898 router.navigate( 899 899 settingsMapper.toAutomatedTrackingHelpDialog() ··· 958 958 private suspend fun loadFirstDayOfWeekViewData(): FirstDayOfWeekViewData { 959 959 return prefsInteractor.getFirstDayOfWeek() 960 960 .let(settingsMapper::toFirstDayOfWeekViewData) 961 + } 962 + 963 + private suspend fun updateDarkModeViewData() { 964 + darkModeViewData.set(loadDarkModeViewData()) 965 + } 966 + 967 + private suspend fun loadDarkModeViewData(): DarkModeViewData { 968 + return prefsInteractor.getSelectedDarkMode() 969 + .let(settingsMapper::toDarkModeViewData) 961 970 } 962 971 963 972 private suspend fun updateStartOfDayViewData() {