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 inactivity reminder recurrent setting

razeeman (Jan 14, 2023, 3:02 PM +0300) 115e9b85 3e4413e3

+146 -12
+1
core/src/main/res/values-de/strings.xml
··· 196 196 <string name="settings_start_of_day">Schichtstart in den Tag</string> 197 197 <string name="settings_inactivity_reminder">Inaktivitätserinnerung anzeigen</string> 198 198 <string name="settings_inactivity_reminder_hint">Benachrichtigung nach der angegebenen Zeit anzeigen, wenn keine Zeiten aktiv sind.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Wiederkehrend</string> 199 200 <string name="settings_ignore_short_records">Ignorieren Sie kurze Aufzeichnungen</string> 200 201 <string name="settings_ignore_short_records_hint">Verfolgen Sie keine Aktivitäten, die kürzer als die angegebene Zeit sind.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Deaktiviert</string>
+1
core/src/main/res/values-es/strings.xml
··· 196 196 <string name="settings_start_of_day">Cambio de inicio del día</string> 197 197 <string name="settings_inactivity_reminder">Mostrar recordatorio de inactividad</string> 198 198 <string name="settings_inactivity_reminder_hint">Mostrar una notificación si no se ha iniciado ningún temporizador tras el tiempo especificado.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Recurrente</string> 199 200 <string name="settings_ignore_short_records">Ignorar registros cortos</string> 200 201 <string name="settings_ignore_short_records_hint">No rastree actividades que sean más cortas que el tiempo especificado.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Deshabilitado</string>
+1
core/src/main/res/values-fr/strings.xml
··· 196 196 <string name="settings_start_of_day">Décalage du début de journée</string> 197 197 <string name="settings_inactivity_reminder">Afficher le rappel d\'inactivité</string> 198 198 <string name="settings_inactivity_reminder_hint">Afficher une notification après la durée spécifiée s\'il n\'y a aucune activité en cours.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Récurrente</string> 199 200 <string name="settings_ignore_short_records">Ignorer les enregistrements courts</string> 200 201 <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> 201 202 <string name="settings_inactivity_reminder_disabled">Désactivé</string>
+1
core/src/main/res/values-hi/strings.xml
··· 196 196 <string name="settings_start_of_day">दिन की शिफ्ट शुरुआत</string> 197 197 <string name="settings_inactivity_reminder">निष्क्रिय गतिविधिया दिखाएं</string> 198 198 <string name="settings_inactivity_reminder_hint">निर्दिष्ट समय के बाद अधिसूचना दिखाएं यदि कोई टाइमर नहीं चल रहा है।</string> 199 + <string name="settings_inactivity_reminder_recurrent">आवर्तक</string> 199 200 <string name="settings_ignore_short_records">छोटे रिकॉर्ड को अनदेखा करें</string> 200 201 <string name="settings_ignore_short_records_hint">उन गतिविधियों को ट्रैक न करें जो निर्दिष्ट समय से कम हैं।</string> 201 202 <string name="settings_inactivity_reminder_disabled">अक्षम</string>
+1
core/src/main/res/values-in/strings.xml
··· 196 196 <string name="settings_start_of_day">Pergeseran awal hari</string> 197 197 <string name="settings_inactivity_reminder">Tampilkan pengingat tidak berkegiatan</string> 198 198 <string name="settings_inactivity_reminder_hint">Tampilkan notifikasi setelah waktu yang ditentukan jika tidak ada pewaktu yang berjalan.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Berulang</string> 199 200 <string name="settings_ignore_short_records">Abaikan rekor pendek</string> 200 201 <string name="settings_ignore_short_records_hint">Jangan melacak aktivitas yang lebih pendek dari waktu yang ditentukan.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Dinonaktifkan</string>
+1
core/src/main/res/values-it/strings.xml
··· 196 196 <string name="settings_start_of_day">Turno di inizio giornata</string> 197 197 <string name="settings_inactivity_reminder">Mostra avviso per inattività</string> 198 198 <string name="settings_inactivity_reminder_hint">Mostra una notifica dopo un certo tempo se non ci sono timer in esecuzione.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Ricorrente</string> 199 200 <string name="settings_ignore_short_records">Ignora i record brevi</string> 200 201 <string name="settings_ignore_short_records_hint">Non tenere traccia delle attività più brevi del tempo specificato.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Disabilitato</string>
+1
core/src/main/res/values-ja/strings.xml
··· 196 196 <string name="settings_start_of_day">1日の開始時間</string> 197 197 <string name="settings_inactivity_reminder">非アクティブ時のリマインダーを表示</string> 198 198 <string name="settings_inactivity_reminder_hint">タイマーが作動していない場合、指定時間後に通知を表示する。</string> 199 + <string name="settings_inactivity_reminder_recurrent">再発性</string> 199 200 <string name="settings_ignore_short_records">短い記録は無視</string> 200 201 <string name="settings_ignore_short_records_hint">指定された時間より短いアクティビティは計測しません。</string> 201 202 <string name="settings_inactivity_reminder_disabled">未設定</string>
+1
core/src/main/res/values-nl/strings.xml
··· 196 196 <string name="settings_start_of_day">Shift begin van de dag</string> 197 197 <string name="settings_inactivity_reminder">Herinnering voor inactiviteit weergeven</string> 198 198 <string name="settings_inactivity_reminder_hint">Toon melding na gespecificeerde tijd als er geen timers lopen.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Terugkerend</string> 199 200 <string name="settings_ignore_short_records">Negeer korte records</string> 200 201 <string name="settings_ignore_short_records_hint">Houd geen activiteiten bij die korter zijn dan de opgegeven tijd.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Uitgeschakeld</string>
+1
core/src/main/res/values-pt/strings.xml
··· 196 196 <string name="settings_start_of_day">Mudar início do dia</string> 197 197 <string name="settings_inactivity_reminder">Mostrar lembrete de inatividade</string> 198 198 <string name="settings_inactivity_reminder_hint">Mostrar notificação após o tempo especificado se nenhum timer estiver em execução.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Recorrente</string> 199 200 <string name="settings_ignore_short_records">Ignorar registros curtos</string> 200 201 <string name="settings_ignore_short_records_hint">Não rastreie atividades mais curtas que o tempo especificado.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Desativado</string>
+1
core/src/main/res/values-ru/strings.xml
··· 196 196 <string name="settings_start_of_day">Сдвинуть начало дня</string> 197 197 <string name="settings_inactivity_reminder">Показать напоминание о бездействии</string> 198 198 <string name="settings_inactivity_reminder_hint">Показывать уведомление по истечении указанного времени, если таймеры не запущены.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Повторяющееся</string> 199 200 <string name="settings_ignore_short_records">Игнорировать короткие записи</string> 200 201 <string name="settings_ignore_short_records_hint">Не отслеживать активности, которые короче указанного времени.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Выкл.</string>
+1
core/src/main/res/values-sv/strings.xml
··· 196 196 <string name="settings_start_of_day">Tid för dagens skiftstart</string> 197 197 <string name="settings_inactivity_reminder">Visa inaktivitetspåminnelse</string> 198 198 <string name="settings_inactivity_reminder_hint">Visa avisering efter angiven tid av inaktivitet.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Återkommande</string> 199 200 <string name="settings_ignore_short_records">Ignorera kortvariga händelser</string> 200 201 <string name="settings_ignore_short_records_hint">Ignorera händelser som är kortare än den angivna tidslängden.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Inaktiverad</string>
+1
core/src/main/res/values-tr/strings.xml
··· 196 196 <string name="settings_start_of_day">Gün başlangıcı</string> 197 197 <string name="settings_inactivity_reminder">İnaktivite hatırlatıcısı göster</string> 198 198 <string name="settings_inactivity_reminder_hint">Eğer herhangi bir zamanlayıcı çalışmıyorsa belirtilen süre sonunda bildirim göster.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Tekrarlayan</string> 199 200 <string name="settings_ignore_short_records">Kısa kayıtları yoksay</string> 200 201 <string name="settings_ignore_short_records_hint">Belirtilen süreden daha kısa olan kayıtları yoksay.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Devre dışı</string>
+1
core/src/main/res/values-uk/strings.xml
··· 196 196 <string name="settings_start_of_day">Зміщення початку доби</string> 197 197 <string name="settings_inactivity_reminder">Показувати нагадування про бездіяльність</string> 198 198 <string name="settings_inactivity_reminder_hint">Показувати сповіщення через вказаний час, якщо таймери не запущені.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Рецидивуючий</string> 199 200 <string name="settings_ignore_short_records">Ігноруйте короткі записи</string> 200 201 <string name="settings_ignore_short_records_hint">Не відстежуйте дії, які коротші за вказаний час.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Вимкнено</string>
+1
core/src/main/res/values-zh/strings.xml
··· 196 196 <string name="settings_start_of_day">改变一天的开始</string> 197 197 <string name="settings_inactivity_reminder">显示无活动提醒</string> 198 198 <string name="settings_inactivity_reminder_hint">如果没有追踪中的活动,则在指定时间后显示通知。</string> 199 + <string name="settings_inactivity_reminder_recurrent">复发性</string> 199 200 <string name="settings_ignore_short_records">忽略短记录</string> 200 201 <string name="settings_ignore_short_records_hint">不要跟踪短于指定时间的活动。</string> 201 202 <string name="settings_inactivity_reminder_disabled">不启用</string>
+1
core/src/main/res/values/strings.xml
··· 196 196 <string name="settings_start_of_day">Shift start of the day</string> 197 197 <string name="settings_inactivity_reminder">Show inactivity reminder</string> 198 198 <string name="settings_inactivity_reminder_hint">Show notification after specified time if no timers are running.</string> 199 + <string name="settings_inactivity_reminder_recurrent">Recurrent</string> 199 200 <string name="settings_ignore_short_records">Ignore short records</string> 200 201 <string name="settings_ignore_short_records_hint">Do not track activities that are shorter than the specified time.</string> 201 202 <string name="settings_inactivity_reminder_disabled">Disabled</string>
+32 -1
features/feature_settings/src/main/res/layout/settings_additional_layout.xml
··· 73 73 app:layout_constraintTop_toTopOf="parent" /> 74 74 75 75 <androidx.appcompat.widget.AppCompatTextView 76 + android:id="@+id/tvSettingsInactivityReminderHint" 76 77 style="@style/SettingsSecondaryText" 77 78 android:layout_width="0dp" 78 79 android:layout_height="wrap_content" 80 + android:paddingBottom="0dp" 79 81 android:text="@string/settings_inactivity_reminder_hint" 82 + app:layout_constraintBottom_toTopOf="@id/tvSettingsInactivityReminderRecurrentHint" 80 83 app:layout_constraintEnd_toStartOf="@id/groupSettingsInactivityReminder" 81 84 app:layout_constraintStart_toStartOf="parent" 82 - app:layout_constraintTop_toBottomOf="@id/tvSettingsInactivityReminder" /> 85 + app:layout_constraintTop_toBottomOf="@id/tvSettingsInactivityReminder" 86 + app:layout_goneMarginBottom="12dp" /> 83 87 84 88 <androidx.appcompat.widget.LinearLayoutCompat 85 89 android:id="@+id/groupSettingsInactivityReminder" ··· 108 112 tools:ignore="ContentDescription" /> 109 113 110 114 </androidx.appcompat.widget.LinearLayoutCompat> 115 + 116 + <androidx.appcompat.widget.AppCompatTextView 117 + android:id="@+id/tvSettingsInactivityReminderRecurrentHint" 118 + style="@style/SettingsText" 119 + android:layout_width="0dp" 120 + android:layout_height="wrap_content" 121 + android:text="@string/settings_inactivity_reminder_recurrent" 122 + app:layout_constraintBottom_toBottomOf="parent" 123 + app:layout_constraintEnd_toStartOf="@id/checkboxSettingsInactivityReminderRecurrent" 124 + app:layout_constraintStart_toStartOf="parent" 125 + app:layout_constraintTop_toBottomOf="@id/tvSettingsInactivityReminderHint" /> 126 + 127 + <androidx.appcompat.widget.AppCompatCheckBox 128 + android:id="@+id/checkboxSettingsInactivityReminderRecurrent" 129 + android:layout_width="wrap_content" 130 + android:layout_height="0dp" 131 + app:layout_constraintBottom_toBottomOf="@id/tvSettingsInactivityReminderRecurrentHint" 132 + app:layout_constraintEnd_toEndOf="parent" 133 + app:layout_constraintTop_toTopOf="@id/tvSettingsInactivityReminderRecurrentHint" /> 134 + 135 + <androidx.constraintlayout.widget.Group 136 + android:id="@+id/groupSettingsInactivityReminderRecurrent" 137 + android:layout_width="match_parent" 138 + android:layout_height="match_parent" 139 + android:visibility="gone" 140 + app:constraint_referenced_ids="tvSettingsInactivityReminderRecurrentHint, checkboxSettingsInactivityReminderRecurrent" 141 + tools:visibility="visible" /> 111 142 112 143 </androidx.constraintlayout.widget.ConstraintLayout> 113 144
+21
app/src/androidTest/java/com/example/util/simpletimetracker/SettingsTest.kt
··· 261 261 withText(R.string.settings_inactivity_reminder_disabled) 262 262 ) 263 263 ) 264 + checkViewIsNotDisplayed(withId(R.id.checkboxSettingsInactivityReminderRecurrent)) 264 265 265 266 // 1s 266 267 clickOnViewWithId(R.id.groupSettingsInactivityReminder) ··· 268 269 clickOnViewWithText(R.string.duration_dialog_save) 269 270 checkViewIsDisplayed(withText("1$secondString")) 270 271 272 + // Check recurrent 273 + onView(withId(R.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 274 + checkViewIsDisplayed(withId(R.id.checkboxSettingsInactivityReminderRecurrent)) 275 + onView(withId(R.id.checkboxSettingsInactivityReminderRecurrent)).check(matches(isNotChecked())) 276 + unconstrainedClickOnView(withId(R.id.checkboxSettingsInactivityReminderRecurrent)) 277 + onView(withId(R.id.checkboxSettingsInactivityReminderRecurrent)).check(matches(isChecked())) 278 + 271 279 // 1m 272 280 clickOnViewWithId(R.id.groupSettingsInactivityReminder) 273 281 clickOnViewWithId(R.id.tvNumberKeyboard0) 274 282 clickOnViewWithId(R.id.tvNumberKeyboard0) 275 283 clickOnViewWithText(R.string.duration_dialog_save) 276 284 checkViewIsDisplayed(withText("1$minuteString")) 285 + onView(withId(R.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 286 + checkViewIsDisplayed(withId(R.id.checkboxSettingsInactivityReminderRecurrent)) 277 287 278 288 // 1h 279 289 clickOnViewWithId(R.id.groupSettingsInactivityReminder) ··· 281 291 clickOnViewWithId(R.id.tvNumberKeyboard0) 282 292 clickOnViewWithText(R.string.duration_dialog_save) 283 293 checkViewIsDisplayed(withText("1$hourString")) 294 + onView(withId(R.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 295 + checkViewIsDisplayed(withId(R.id.checkboxSettingsInactivityReminderRecurrent)) 284 296 285 297 // 1m 1s 286 298 clickOnViewWithId(R.id.groupSettingsInactivityReminder) ··· 290 302 clickOnViewWithId(R.id.tvNumberKeyboard1) 291 303 clickOnViewWithText(R.string.duration_dialog_save) 292 304 checkViewIsDisplayed(withText("1$minuteString 01$secondString")) 305 + onView(withId(R.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 306 + checkViewIsDisplayed(withId(R.id.checkboxSettingsInactivityReminderRecurrent)) 293 307 294 308 // 1h 1m 1s 295 309 clickOnViewWithId(R.id.groupSettingsInactivityReminder) ··· 297 311 clickOnViewWithId(R.id.tvNumberKeyboard1) 298 312 clickOnViewWithText(R.string.duration_dialog_save) 299 313 checkViewIsDisplayed(withText("1$hourString 01$minuteString 01$secondString")) 314 + onView(withId(R.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 315 + checkViewIsDisplayed(withId(R.id.checkboxSettingsInactivityReminderRecurrent)) 300 316 301 317 // 1h 30m 302 318 clickOnViewWithId(R.id.groupSettingsInactivityReminder) ··· 307 323 clickOnViewWithId(R.id.tvNumberKeyboard0) 308 324 clickOnViewWithText(R.string.duration_dialog_save) 309 325 checkViewIsDisplayed(withText("1$hourString 30$minuteString")) 326 + onView(withId(R.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 327 + checkViewIsDisplayed(withId(R.id.checkboxSettingsInactivityReminderRecurrent)) 310 328 311 329 // 99h 99m 99s 312 330 clickOnViewWithId(R.id.groupSettingsInactivityReminder) ··· 314 332 repeat(6) { clickOnViewWithId(R.id.tvNumberKeyboard9) } 315 333 clickOnViewWithText(R.string.duration_dialog_save) 316 334 checkViewIsDisplayed(withText("100$hourString 40$minuteString 39$secondString")) 335 + onView(withId(R.id.checkboxSettingsInactivityReminderRecurrent)).perform(nestedScrollTo()) 336 + checkViewIsDisplayed(withId(R.id.checkboxSettingsInactivityReminderRecurrent)) 317 337 318 338 // Disable 319 339 clickOnViewWithId(R.id.groupSettingsInactivityReminder) ··· 324 344 withText(R.string.settings_inactivity_reminder_disabled) 325 345 ) 326 346 ) 347 + checkViewIsNotDisplayed(withId(R.id.checkboxSettingsInactivityReminderRecurrent)) 327 348 } 328 349 329 350 @Test
+5
data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/PrefsRepoImpl.kt
··· 100 100 KEY_INACTIVITY_REMINDER_DURATION, 0 // 0 is for disabled 101 101 ) 102 102 103 + override var inactivityReminderRecurrent: Boolean by prefs.delegate( 104 + KEY_INACTIVITY_REMINDER_RECURRENT, false 105 + ) 106 + 103 107 override var ignoreShortRecordsDuration: Long by prefs.delegate( 104 108 KEY_IGNORE_SHORT_RECORDS_DURATION, 0 // 0 is for disabled 105 109 ) ··· 262 266 private const val KEY_ALLOW_MULTITASKING = "allowMultitasking" 263 267 private const val KEY_SHOW_NOTIFICATIONS = "showNotifications" 264 268 private const val KEY_INACTIVITY_REMINDER_DURATION = "inactivityReminderDuration" 269 + private const val KEY_INACTIVITY_REMINDER_RECURRENT = "inactivityReminderRecurrent" 265 270 private const val KEY_IGNORE_SHORT_RECORDS_DURATION = "ignoreShortRecordsDuration" 266 271 private const val KEY_DARK_MODE = "darkMode" 267 272 private const val KEY_NUMBER_OF_CARDS = "numberOfCards" // 0 - default width
+8
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/PrefsInteractor.kt
··· 192 192 prefsRepo.inactivityReminderDuration = duration 193 193 } 194 194 195 + suspend fun getInactivityReminderRecurrent(): Boolean = withContext(Dispatchers.IO) { 196 + prefsRepo.inactivityReminderRecurrent 197 + } 198 + 199 + suspend fun setInactivityReminderRecurrent(isRecurrent: Boolean) = withContext(Dispatchers.IO) { 200 + prefsRepo.inactivityReminderRecurrent = isRecurrent 201 + } 202 + 195 203 suspend fun getIgnoreShortRecordsDuration(): Long = withContext(Dispatchers.IO) { 196 204 prefsRepo.ignoreShortRecordsDuration 197 205 }
+2
domain/src/main/java/com/example/util/simpletimetracker/domain/repo/PrefsRepo.kt
··· 40 40 41 41 var inactivityReminderDuration: Long // in seconds 42 42 43 + var inactivityReminderRecurrent: Boolean 44 + 43 45 var ignoreShortRecordsDuration: Long // in seconds 44 46 45 47 var darkMode: Boolean
+10 -3
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt
··· 14 14 import com.example.util.simpletimetracker.feature_settings.R 15 15 import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 16 16 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 17 + import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 17 18 import com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 18 19 import com.example.util.simpletimetracker.navigation.params.screen.HelpDialogParams 19 20 import java.util.Calendar ··· 84 85 return dayOfWeekList.getOrElse(position) { dayOfWeekList.first() } 85 86 } 86 87 87 - fun toDurationText(duration: Long): String { 88 + fun toDurationViewData(duration: Long): SettingsDurationViewData { 88 89 return if (duration > 0) { 89 - timeMapper.formatDuration(duration) 90 + SettingsDurationViewData( 91 + text = timeMapper.formatDuration(duration), 92 + enabled = true, 93 + ) 90 94 } else { 91 - resourceRepo.getString(R.string.settings_inactivity_reminder_disabled) 95 + SettingsDurationViewData( 96 + text = resourceRepo.getString(R.string.settings_inactivity_reminder_disabled), 97 + enabled = false, 98 + ) 92 99 } 93 100 } 94 101
+13 -1
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 24 24 import dagger.hilt.android.AndroidEntryPoint 25 25 import javax.inject.Inject 26 26 import com.example.util.simpletimetracker.feature_settings.databinding.SettingsFragmentBinding as Binding 27 + import androidx.core.view.isVisible 28 + import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 27 29 28 30 @AndroidEntryPoint 29 31 class SettingsFragment : ··· 88 90 btnSettingsStartOfDaySign.setOnClick(viewModel::onStartOfDaySignClicked) 89 91 checkboxSettingsKeepStatisticsRange.setOnClick(viewModel::onKeepStatisticsRangeClicked) 90 92 groupSettingsInactivityReminder.setOnClick(viewModel::onInactivityReminderClicked) 93 + checkboxSettingsInactivityReminderRecurrent.setOnClick(viewModel::onInactivityReminderRecurrentClicked) 91 94 groupSettingsIgnoreShortRecords.setOnClick(viewModel::onIgnoreShortRecordsClicked) 92 95 checkboxSettingsShowRecordTagSelection.setOnClick(viewModel::onShowRecordTagSelectionClicked) 93 96 checkboxSettingsRecordTagSelectionClose.setOnClick(viewModel::onRecordTagSelectionCloseClicked) ··· 134 137 arrowSettingsAdditional.apply { if (opened) rotateDown() else rotateUp() } 135 138 } 136 139 keepStatisticsRangeCheckbox.observe(checkboxSettingsKeepStatisticsRange::setChecked) 137 - inactivityReminderViewData.observe(tvSettingsInactivityReminderTime::setText) 140 + inactivityReminderViewData.observe(::updateInactivityReminder) 141 + inactivityReminderRecurrentCheckbox.observe(checkboxSettingsInactivityReminderRecurrent::setChecked) 138 142 ignoreShortRecordsViewData.observe(tvSettingsIgnoreShortRecordsTime::setText) 139 143 recordTagSelectionCloseCheckbox.observe(checkboxSettingsRecordTagSelectionClose::setChecked) 140 144 } ··· 172 176 spinnerSettingsFirstDayOfWeek.jumpDrawablesToCurrentState() 173 177 checkboxSettingsKeepStatisticsRange.jumpDrawablesToCurrentState() 174 178 checkboxSettingsShowRecordTagSelection.jumpDrawablesToCurrentState() 179 + checkboxSettingsInactivityReminderRecurrent.jumpDrawablesToCurrentState() 175 180 checkboxSettingsRecordTagSelectionClose.jumpDrawablesToCurrentState() 176 181 } 177 182 viewModel.onVisible() ··· 219 224 ) = with(binding.layoutSettingsAdditional) { 220 225 checkboxSettingsShowRecordTagSelection.isChecked = isChecked 221 226 groupSettingsRecordTagSelectionClose.visible = isChecked 227 + } 228 + 229 + private fun updateInactivityReminder( 230 + data: SettingsDurationViewData, 231 + ) = with(binding.layoutSettingsAdditional) { 232 + tvSettingsInactivityReminderTime.text = data.text 233 + groupSettingsInactivityReminderRecurrent.isVisible = data.enabled 222 234 } 223 235 224 236 private fun updateShowRecordCalendarChecked(
+6
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewData/SettingsDurationViewData.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.viewData 2 + 3 + data class SettingsDurationViewData( 4 + val text: String, 5 + val enabled: Boolean, 6 + )
+24 -5
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt
··· 24 24 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 25 25 import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 26 26 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 27 + import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 27 28 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsStartOfDayViewData 28 29 import com.example.util.simpletimetracker.navigation.Router 29 30 import com.example.util.simpletimetracker.navigation.params.action.OpenMarketParams ··· 152 153 } 153 154 } 154 155 155 - val inactivityReminderViewData: LiveData<String> by lazy { 156 - MutableLiveData<String>().let { initial -> 156 + val inactivityReminderViewData: LiveData<SettingsDurationViewData> by lazy { 157 + MutableLiveData<SettingsDurationViewData>().let { initial -> 157 158 viewModelScope.launch { 158 159 initial.value = loadInactivityReminderViewData() 160 + } 161 + initial 162 + } 163 + } 164 + 165 + val inactivityReminderRecurrentCheckbox: LiveData<Boolean> by lazy { 166 + MutableLiveData<Boolean>().let { initial -> 167 + viewModelScope.launch { 168 + initial.value = prefsInteractor.getInactivityReminderRecurrent() 159 169 } 160 170 initial 161 171 } ··· 417 427 } 418 428 } 419 429 430 + fun onInactivityReminderRecurrentClicked() { 431 + viewModelScope.launch { 432 + val newValue = !prefsInteractor.getInactivityReminderRecurrent() 433 + prefsInteractor.setInactivityReminderRecurrent(newValue) 434 + inactivityReminderRecurrentCheckbox.set(newValue) 435 + } 436 + } 437 + 420 438 fun onIgnoreShortRecordsClicked() { 421 439 viewModelScope.launch { 422 440 DurationDialogParams( ··· 605 623 inactivityReminderViewData.set(data) 606 624 } 607 625 608 - private suspend fun loadInactivityReminderViewData(): String { 626 + private suspend fun loadInactivityReminderViewData(): SettingsDurationViewData { 609 627 return prefsInteractor.getInactivityReminderDuration() 610 - .let(settingsMapper::toDurationText) 628 + .let(settingsMapper::toDurationViewData) 611 629 } 612 630 613 631 private suspend fun updateIgnoreShortRecordsViewData() { ··· 617 635 618 636 private suspend fun loadIgnoreShortRecordsViewData(): String { 619 637 return prefsInteractor.getIgnoreShortRecordsDuration() 620 - .let(settingsMapper::toDurationText) 638 + .let(settingsMapper::toDurationViewData) 639 + .text 621 640 } 622 641 623 642 private suspend fun updateUseMilitaryTimeViewData() {
+10 -2
features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/inactivity/controller/NotificationInactivityBroadcastController.kt
··· 1 1 package com.example.util.simpletimetracker.feature_notification.inactivity.controller 2 2 3 3 import com.example.util.simpletimetracker.domain.interactor.NotificationInactivityInteractor 4 + import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 4 5 import kotlinx.coroutines.GlobalScope 5 6 import kotlinx.coroutines.launch 6 7 import javax.inject.Inject 7 8 8 9 class NotificationInactivityBroadcastController @Inject constructor( 10 + private val prefsInteractor: PrefsInteractor, 9 11 private val notificationInactivityInteractor: NotificationInactivityInteractor, 10 12 ) { 11 13 12 14 fun onInactivityReminder() = GlobalScope.launch { 13 15 notificationInactivityInteractor.show() 14 - notificationInactivityInteractor.checkAndSchedule() 16 + checkAndSchedule() 15 17 } 16 18 17 19 fun onBootCompleted() = GlobalScope.launch { 18 - notificationInactivityInteractor.checkAndSchedule() 20 + checkAndSchedule() 21 + } 22 + 23 + private suspend fun checkAndSchedule() { 24 + if (prefsInteractor.getInactivityReminderRecurrent()) { 25 + notificationInactivityInteractor.checkAndSchedule() 26 + } 19 27 } 20 28 }