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 repeat button type setting

razeeman (Aug 5, 2023, 4:43 PM +0300) 1e2f44fb 9476ae38

+370 -149
+9
core/src/main/res/drawable/repeat.xml
··· 1 + <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 + android:width="24dp" 3 + android:height="24dp" 4 + android:viewportWidth="24" 5 + android:viewportHeight="24"> 6 + <path 7 + android:fillColor="#FF000000" 8 + android:pathData="M15.55,5.55L11,1v3.07C7.06,4.56 4,7.92 4,12s3.05,7.44 7,7.93v-2.02c-2.84,-0.48 -5,-2.94 -5,-5.91s2.16,-5.43 5,-5.91L11,10l4.55,-4.45zM19.93,11c-0.17,-1.39 -0.72,-2.73 -1.62,-3.89l-1.42,1.42c0.54,0.75 0.88,1.6 1.02,2.47h2.02zM13,17.9v2.02c1.39,-0.17 2.74,-0.71 3.9,-1.61l-1.44,-1.44c-0.75,0.54 -1.59,0.89 -2.46,1.03zM16.89,15.48l1.42,1.41c0.9,-1.16 1.45,-2.5 1.62,-3.89h-2.02c-0.14,0.87 -0.48,1.72 -1.02,2.48z"/> 9 + </vector>
-9
core/src/main/res/drawable/restart.xml
··· 1 - <vector xmlns:android="http://schemas.android.com/apk/res/android" 2 - android:width="24dp" 3 - android:height="24dp" 4 - android:viewportWidth="24" 5 - android:viewportHeight="24"> 6 - <path 7 - android:fillColor="#FF000000" 8 - android:pathData="M15.55,5.55L11,1v3.07C7.06,4.56 4,7.92 4,12s3.05,7.44 7,7.93v-2.02c-2.84,-0.48 -5,-2.94 -5,-5.91s2.16,-5.43 5,-5.91L11,10l4.55,-4.45zM19.93,11c-0.17,-1.39 -0.72,-2.73 -1.62,-3.89l-1.42,1.42c0.54,0.75 0.88,1.6 1.02,2.47h2.02zM13,17.9v2.02c1.39,-0.17 2.74,-0.71 3.9,-1.61l-1.44,-1.44c-0.75,0.54 -1.59,0.89 -2.46,1.03zM16.89,15.48l1.42,1.41c0.9,-1.16 1.45,-2.5 1.62,-3.89h-2.02c-0.14,0.87 -0.48,1.72 -1.02,2.48z"/> 9 - </vector>
+6 -3
core/src/main/res/values-ar/strings.xml
··· 189 189 <string name="running_records_add_type">يضيف</string> 190 190 <string name="running_records_add_filter">أضف عامل تصفية</string> 191 191 <string name="running_records_add_default">تقصير</string> 192 - <string name="running_records_restart">يكرر</string> 193 - <string name="running_records_restart_no_prev_record">لا يوجد سجل سابق لإعادة التشغيل</string> 194 - <string name="running_records_restart_already_tracking">تتبع بالفعل هذا النشاط</string> 192 + <string name="running_records_repeat">يكرر</string> 193 + <string name="running_records_repeat_no_prev_record">لا يوجد سجل سابق لإعادة التشغيل</string> 194 + <string name="running_records_repeat_already_tracking">تتبع بالفعل هذا النشاط</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">إعدادات العرض</string> ··· 203 203 <string name="settings_sort_by_color">اللون</string> 204 204 <string name="settings_sort_manually">يدويا</string> 205 205 <string name="settings_first_day_of_week">اليوم الأول من الأسبوع</string> 206 + <string name="settings_repeat_button_type">زر التكرار</string> 207 + <string name="settings_repeat_last_record">كرر السجل الأخير</string> 208 + <string name="settings_repeat_one_before_last">كرر التسجيل قبل الماضي</string> 206 209 <string name="settings_show_untracked_time">إظهار الوقت غير المتعقب في التتبعات</string> 207 210 <string name="settings_show_untracked_time_statistics">إظهار الوقت الذي لم يتم تعقبه في الإحصائيات</string> 208 211 <string name="settings_ignore_short_untracked">تجاهل الوقت القصير غير المتعقب</string>
+6 -3
core/src/main/res/values-ca/strings.xml
··· 189 189 <string name="running_records_add_type">Afegeix</string> 190 190 <string name="running_records_add_filter">Afegeix filtre</string> 191 191 <string name="running_records_add_default">Per defecte</string> 192 - <string name="running_records_restart">Repetiu</string> 193 - <string name="running_records_restart_no_prev_record">No hi ha registre anterior per reiniciar</string> 194 - <string name="running_records_restart_already_tracking">Ja s\'està fent el seguiment d\'aquesta activitat</string> 192 + <string name="running_records_repeat">Repetiu</string> 193 + <string name="running_records_repeat_no_prev_record">No hi ha registre anterior per reiniciar</string> 194 + <string name="running_records_repeat_already_tracking">Ja s\'està fent el seguiment d\'aquesta activitat</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Configuració de visualització</string> ··· 203 203 <string name="settings_sort_by_color">Color</string> 204 204 <string name="settings_sort_manually">Manual</string> 205 205 <string name="settings_first_day_of_week">Primer dia de la setmana</string> 206 + <string name="settings_repeat_button_type">Botó de repetició</string> 207 + <string name="settings_repeat_last_record">Repetiu l\'últim registre</string> 208 + <string name="settings_repeat_one_before_last">Repetiu el registre abans de l\'últim</string> 206 209 <string name="settings_show_untracked_time">Mostra el temps no enregistrat als enregistraments</string> 207 210 <string name="settings_show_untracked_time_statistics">Mostra el temps no enregistrat a les estadístiques</string> 208 211 <string name="settings_ignore_short_untracked">Ignora el temps curt sense seguiment</string>
+6 -3
core/src/main/res/values-de/strings.xml
··· 189 189 <string name="running_records_add_type">Hinz.</string> 190 190 <string name="running_records_add_filter">Filter hinzufügen</string> 191 191 <string name="running_records_add_default">Standard</string> 192 - <string name="running_records_restart">Wiederholen</string> 193 - <string name="running_records_restart_no_prev_record">Kein vorheriger Datensatz zum Neustart vorhanden</string> 194 - <string name="running_records_restart_already_tracking">Verfolgen Sie diese Aktivität bereits</string> 192 + <string name="running_records_repeat">Wiederholen</string> 193 + <string name="running_records_repeat_no_prev_record">Kein vorheriger Datensatz zum Neustart vorhanden</string> 194 + <string name="running_records_repeat_already_tracking">Verfolgen Sie diese Aktivität bereits</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Bildschirmeinstellungen</string> ··· 203 203 <string name="settings_sort_by_color">Farbe</string> 204 204 <string name="settings_sort_manually">Manuell</string> 205 205 <string name="settings_first_day_of_week">Erster Tag der Woche</string> 206 + <string name="settings_repeat_button_type">Wiederholen-Taste</string> 207 + <string name="settings_repeat_last_record">Letzte Aufnahme wiederholen</string> 208 + <string name="settings_repeat_one_before_last">Vorletzte Aufnahme wiederholen</string> 206 209 <string name="settings_show_untracked_time">Nicht verfolgte Zeit in Datensätzen anzeigen</string> 207 210 <string name="settings_show_untracked_time_statistics">Nicht verfolgte Zeit in Statistik anzeigen</string> 208 211 <string name="settings_ignore_short_untracked">Ignorieren Sie kurze, nicht verfolgte Zeit</string>
+6 -3
core/src/main/res/values-es/strings.xml
··· 189 189 <string name="running_records_add_type">Añadir</string> 190 190 <string name="running_records_add_filter">Añadir filtro</string> 191 191 <string name="running_records_add_default">Por defecto</string> 192 - <string name="running_records_restart">Repetir</string> 193 - <string name="running_records_restart_no_prev_record">Sin registro previo para reiniciar</string> 194 - <string name="running_records_restart_already_tracking">Ya estoy rastreando esta actividad</string> 192 + <string name="running_records_repeat">Repetir</string> 193 + <string name="running_records_repeat_no_prev_record">Sin registro previo para reiniciar</string> 194 + <string name="running_records_repeat_already_tracking">Ya estoy rastreando esta actividad</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Configuración de pantalla</string> ··· 203 203 <string name="settings_sort_by_color">Color</string> 204 204 <string name="settings_sort_manually">Manual</string> 205 205 <string name="settings_first_day_of_week">Primer día de la semana</string> 206 + <string name="settings_repeat_button_type">Botón de repetición</string> 207 + <string name="settings_repeat_last_record">Repetir último registro</string> 208 + <string name="settings_repeat_one_before_last">Repetir el registro anterior al último</string> 206 209 <string name="settings_show_untracked_time">Mostrar el tiempo no registrado en los registros</string> 207 210 <string name="settings_show_untracked_time_statistics">Mostrar el tiempo no registrado en las estadísticas</string> 208 211 <string name="settings_ignore_short_untracked">Ignorar tiempo corto sin seguimiento</string>
+6 -3
core/src/main/res/values-fa/strings.xml
··· 189 189 <string name="running_records_add_type">اضافه کردن</string> 190 190 <string name="running_records_add_filter">اضافه کردن فیلتر</string> 191 191 <string name="running_records_add_default">پیش فرض</string> 192 - <string name="running_records_restart">تکرار</string> 193 - <string name="running_records_restart_no_prev_record">رکورد قبلی برای راه اندازی مجدد وجود ندارد</string> 194 - <string name="running_records_restart_already_tracking">در حال حاضر این فعالیت را دنبال می کنم</string> 192 + <string name="running_records_repeat">تکرار</string> 193 + <string name="running_records_repeat_no_prev_record">رکورد قبلی برای راه اندازی مجدد وجود ندارد</string> 194 + <string name="running_records_repeat_already_tracking">در حال حاضر این فعالیت را دنبال می کنم</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">نمایش تنظیمات</string> ··· 203 203 <string name="settings_sort_by_color">رنگ</string> 204 204 <string name="settings_sort_manually">دستی</string> 205 205 <string name="settings_first_day_of_week">اولین روز هفته</string> 206 + <string name="settings_repeat_button_type">دکمه تکرار</string> 207 + <string name="settings_repeat_last_record">آخرین رکورد را تکرار کنید</string> 208 + <string name="settings_repeat_one_before_last">تکرار رکورد قبل از آخرین</string> 206 209 <string name="settings_show_untracked_time">زمان اندازه گیری نشده را در تاریخچه نمایش بده</string> 207 210 <string name="settings_show_untracked_time_statistics">نمایش زمان پیگیری نشده در آمار</string> 208 211 <string name="settings_ignore_short_untracked">چشم پوشی از زمان کوتاه اندازه گیری نشده</string>
+6 -3
core/src/main/res/values-fr/strings.xml
··· 189 189 <string name="running_records_add_type">Ajouter</string> 190 190 <string name="running_records_add_filter">Ajouter un filtre</string> 191 191 <string name="running_records_add_default">Défaut</string> 192 - <string name="running_records_restart">Répéter</string> 193 - <string name="running_records_restart_no_prev_record">Aucun enregistrement précédent à redémarrer</string> 194 - <string name="running_records_restart_already_tracking">Suivi déjà de cette activité</string> 192 + <string name="running_records_repeat">Répéter</string> 193 + <string name="running_records_repeat_no_prev_record">Aucun enregistrement précédent à redémarrer</string> 194 + <string name="running_records_repeat_already_tracking">Suivi déjà de cette activité</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Paramètres d\'affichage</string> ··· 203 203 <string name="settings_sort_by_color">Par couleur</string> 204 204 <string name="settings_sort_manually">Manuellement</string> 205 205 <string name="settings_first_day_of_week">Premier jour de la semaine</string> 206 + <string name="settings_repeat_button_type">Bouton de répétition</string> 207 + <string name="settings_repeat_last_record">Répéter le dernier enregistrement</string> 208 + <string name="settings_repeat_one_before_last">Répéter l\'enregistrement avant le dernier</string> 206 209 <string name="settings_show_untracked_time">Afficher le temps non suivi dans la liste des enregistrements</string> 207 210 <string name="settings_show_untracked_time_statistics">Afficher le temps non suivi dans les statistiques</string> 208 211 <string name="settings_ignore_short_untracked">Ignorer le temps court non suivi</string>
+6 -3
core/src/main/res/values-hi/strings.xml
··· 189 189 <string name="running_records_add_type">जोड़ें</string> 190 190 <string name="running_records_add_filter">फ़िल्टर जोड़ें</string> 191 191 <string name="running_records_add_default">गलती करना</string> 192 - <string name="running_records_restart">दोहराना</string> 193 - <string name="running_records_restart_no_prev_record">पुनः आरंभ करने के लिए कोई पिछला रिकॉर्ड नहीं</string> 194 - <string name="running_records_restart_already_tracking">इस गतिविधि पर पहले से ही नज़र रखी जा रही है</string> 192 + <string name="running_records_repeat">दोहराना</string> 193 + <string name="running_records_repeat_no_prev_record">पुनः आरंभ करने के लिए कोई पिछला रिकॉर्ड नहीं</string> 194 + <string name="running_records_repeat_already_tracking">इस गतिविधि पर पहले से ही नज़र रखी जा रही है</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">प्रदर्शन सेटिंग्स</string> ··· 203 203 <string name="settings_sort_by_color">रंग</string> 204 204 <string name="settings_sort_manually">हस्तचालन से</string> 205 205 <string name="settings_first_day_of_week">सप्ताह का पहला दिन</string> 206 + <string name="settings_repeat_button_type">दोहराएँ बटन</string> 207 + <string name="settings_repeat_last_record">पिछला रिकॉर्ड दोहराएँ</string> 208 + <string name="settings_repeat_one_before_last">पिछले से पहले रिकॉर्ड दोहराएँ</string> 206 209 <string name="settings_show_untracked_time">रिकॉर्ड में अनट्रैक समय दिखाएं</string> 207 210 <string name="settings_show_untracked_time_statistics">आँकड़ों में ट्रैक न किया गया समय दिखाएँ</string> 208 211 <string name="settings_ignore_short_untracked">कम अनट्रैक समय पर ध्यान न दें</string>
+6 -3
core/src/main/res/values-in/strings.xml
··· 189 189 <string name="running_records_add_type">Tambah</string> 190 190 <string name="running_records_add_filter">Tambahkan filter</string> 191 191 <string name="running_records_add_default">Bawaan</string> 192 - <string name="running_records_restart">Mengulang</string> 193 - <string name="running_records_restart_no_prev_record">Tidak ada catatan sebelumnya untuk memulai kembali</string> 194 - <string name="running_records_restart_already_tracking">Sudah melacak aktivitas ini</string> 192 + <string name="running_records_repeat">Mengulang</string> 193 + <string name="running_records_repeat_no_prev_record">Tidak ada catatan sebelumnya untuk memulai kembali</string> 194 + <string name="running_records_repeat_already_tracking">Sudah melacak aktivitas ini</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Pengaturan tampilan</string> ··· 203 203 <string name="settings_sort_by_color">Warna</string> 204 204 <string name="settings_sort_manually">Secara manual</string> 205 205 <string name="settings_first_day_of_week">Hari pertama dalam seminggu</string> 206 + <string name="settings_repeat_button_type">Tombol ulangi</string> 207 + <string name="settings_repeat_last_record">Ulangi rekaman terakhir</string> 208 + <string name="settings_repeat_one_before_last">Ulangi rekaman sebelum yang terakhir</string> 206 209 <string name="settings_show_untracked_time">Tampilkan waktu tak terlacak dalam rekor</string> 207 210 <string name="settings_show_untracked_time_statistics">Tampilkan waktu tak terlacak dalam statistik</string> 208 211 <string name="settings_ignore_short_untracked">Abaikan waktu singkat yang tidak terlacak</string>
+6 -3
core/src/main/res/values-it/strings.xml
··· 189 189 <string name="running_records_add_type">Aggiungi</string> 190 190 <string name="running_records_add_filter">Aggiungi filtro</string> 191 191 <string name="running_records_add_default">Predefinito</string> 192 - <string name="running_records_restart">Ripetere</string> 193 - <string name="running_records_restart_no_prev_record">Nessun record precedente da riavviare</string> 194 - <string name="running_records_restart_already_tracking">Stiamo già monitorando questa attività</string> 192 + <string name="running_records_repeat">Ripetere</string> 193 + <string name="running_records_repeat_no_prev_record">Nessun record precedente da riavviare</string> 194 + <string name="running_records_repeat_already_tracking">Stiamo già monitorando questa attività</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Impostazioni di visualizzazione</string> ··· 203 203 <string name="settings_sort_by_color">Colore</string> 204 204 <string name="settings_sort_manually">Manualmente</string> 205 205 <string name="settings_first_day_of_week">Primo giorno della settimana</string> 206 + <string name="settings_repeat_button_type">Pulsante Ripeti</string> 207 + <string name="settings_repeat_last_record">Ripeti l\'ultimo record</string> 208 + <string name="settings_repeat_one_before_last">Ripeti record prima dell\'ultimo</string> 206 209 <string name="settings_show_untracked_time">Mostra tempo non tracciato nelle registrazioni</string> 207 210 <string name="settings_show_untracked_time_statistics">Mostra tempo non tracciato nelle statistiche</string> 208 211 <string name="settings_ignore_short_untracked">Ignora il breve tempo non tracciato</string>
+6 -3
core/src/main/res/values-ja/strings.xml
··· 189 189 <string name="running_records_add_type">追加</string> 190 190 <string name="running_records_add_filter">フィルタを追加</string> 191 191 <string name="running_records_add_default">デフォルト</string> 192 - <string name="running_records_restart">繰り返す</string> 193 - <string name="running_records_restart_no_prev_record">再開する以前のレコードがありません</string> 194 - <string name="running_records_restart_already_tracking">すでにこのアクティビティを追跡しています</string> 192 + <string name="running_records_repeat">繰り返す</string> 193 + <string name="running_records_repeat_no_prev_record">再開する以前のレコードがありません</string> 194 + <string name="running_records_repeat_already_tracking">すでにこのアクティビティを追跡しています</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">設定を表示</string> ··· 203 203 <string name="settings_sort_by_color">色</string> 204 204 <string name="settings_sort_manually">手動</string> 205 205 <string name="settings_first_day_of_week">週の始まり</string> 206 + <string name="settings_repeat_button_type">リピートボタン</string> 207 + <string name="settings_repeat_last_record">最後のレコードを繰り返す</string> 208 + <string name="settings_repeat_one_before_last">最後の前のレコードを繰り返します</string> 206 209 <string name="settings_show_untracked_time">記録中の未追跡時間の表示</string> 207 210 <string name="settings_show_untracked_time_statistics">追跡されていない時間を統計で表示する</string> 208 211 <string name="settings_ignore_short_untracked">追跡されていない短い時間を無視する</string>
+6 -3
core/src/main/res/values-nl/strings.xml
··· 189 189 <string name="running_records_add_type">Toevoegen</string> 190 190 <string name="running_records_add_filter">Filter toevoegen</string> 191 191 <string name="running_records_add_default">Standaard</string> 192 - <string name="running_records_restart">Herhalen</string> 193 - <string name="running_records_restart_no_prev_record">Geen vorig record om opnieuw te starten</string> 194 - <string name="running_records_restart_already_tracking">Volgt deze activiteit al</string> 192 + <string name="running_records_repeat">Herhalen</string> 193 + <string name="running_records_repeat_no_prev_record">Geen vorig record om opnieuw te starten</string> 194 + <string name="running_records_repeat_already_tracking">Volgt deze activiteit al</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Scherminstellingen</string> ··· 203 203 <string name="settings_sort_by_color">Kleur</string> 204 204 <string name="settings_sort_manually">Handmatig</string> 205 205 <string name="settings_first_day_of_week">Eerste dag van de week</string> 206 + <string name="settings_repeat_button_type">Herhaal knop</string> 207 + <string name="settings_repeat_last_record">Herhaal de laatste opname</string> 208 + <string name="settings_repeat_one_before_last">Herhaal record voor het laatst</string> 206 209 <string name="settings_show_untracked_time">Toon niet-gevolgde tijd in records</string> 207 210 <string name="settings_show_untracked_time_statistics">Toon niet-gevolgde tijd in statistieken</string> 208 211 <string name="settings_ignore_short_untracked">Negeer korte niet-gevolgde tijd</string>
+6 -3
core/src/main/res/values-pt/strings.xml
··· 189 189 <string name="running_records_add_type">Adicionar</string> 190 190 <string name="running_records_add_filter">Adicionar filtro</string> 191 191 <string name="running_records_add_default">Padrão</string> 192 - <string name="running_records_restart">Repita</string> 193 - <string name="running_records_restart_no_prev_record">Nenhum registro anterior para reiniciar</string> 194 - <string name="running_records_restart_already_tracking">Já está acompanhando esta atividade</string> 192 + <string name="running_records_repeat">Repita</string> 193 + <string name="running_records_repeat_no_prev_record">Nenhum registro anterior para reiniciar</string> 194 + <string name="running_records_repeat_already_tracking">Já está acompanhando esta atividade</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Configurações do visor</string> ··· 203 203 <string name="settings_sort_by_color">Cor</string> 204 204 <string name="settings_sort_manually">Manualmente</string> 205 205 <string name="settings_first_day_of_week">Primeiro dia da semana</string> 206 + <string name="settings_repeat_button_type">Botão de repetição</string> 207 + <string name="settings_repeat_last_record">Repetir último registro</string> 208 + <string name="settings_repeat_one_before_last">Repetir registro antes do último</string> 206 209 <string name="settings_show_untracked_time">Mostrar tempo não rastreado nos registros</string> 207 210 <string name="settings_show_untracked_time_statistics">Mostrar tempo não rastreado nas estatísticas</string> 208 211 <string name="settings_ignore_short_untracked">Ignorar tempo curto não rastreado</string>
+6 -3
core/src/main/res/values-ru/strings.xml
··· 189 189 <string name="running_records_add_type">Добав.</string> 190 190 <string name="running_records_add_filter">Добавить фильтр</string> 191 191 <string name="running_records_add_default">По умолч.</string> 192 - <string name="running_records_restart">Повтор</string> 193 - <string name="running_records_restart_no_prev_record">Нет предыдущей записи для перезапуска</string> 194 - <string name="running_records_restart_already_tracking">Эта активность уже отслеживается</string> 192 + <string name="running_records_repeat">Повтор</string> 193 + <string name="running_records_repeat_no_prev_record">Нет предыдущей записи для перезапуска</string> 194 + <string name="running_records_repeat_already_tracking">Эта активность уже отслеживается</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Настройки отображения</string> ··· 203 203 <string name="settings_sort_by_color">Цвет</string> 204 204 <string name="settings_sort_manually">Вручную</string> 205 205 <string name="settings_first_day_of_week">Первый день недели</string> 206 + <string name="settings_repeat_button_type">Кнопка повтора</string> 207 + <string name="settings_repeat_last_record">Повторить последнюю запись</string> 208 + <string name="settings_repeat_one_before_last">Повторить запись перед последней</string> 206 209 <string name="settings_show_untracked_time">Показывать неотслеженное время в записях</string> 207 210 <string name="settings_show_untracked_time_statistics">Показывать неотслеженное время в статистике</string> 208 211 <string name="settings_ignore_short_untracked">Игнорировать короткое неотслеживаемое время</string>
+6 -3
core/src/main/res/values-sv/strings.xml
··· 189 189 <string name="running_records_add_type">Lägg till</string> 190 190 <string name="running_records_add_filter">Lägg till filter</string> 191 191 <string name="running_records_add_default">Standard</string> 192 - <string name="running_records_restart">Upprepa</string> 193 - <string name="running_records_restart_no_prev_record">Inget tidigare rekord att starta om</string> 194 - <string name="running_records_restart_already_tracking">Spårar redan denna aktivitet</string> 192 + <string name="running_records_repeat">Upprepa</string> 193 + <string name="running_records_repeat_no_prev_record">Inget tidigare rekord att starta om</string> 194 + <string name="running_records_repeat_already_tracking">Spårar redan denna aktivitet</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Bildskärmsinställningar</string> ··· 203 203 <string name="settings_sort_by_color">Färg</string> 204 204 <string name="settings_sort_manually">Manuellt</string> 205 205 <string name="settings_first_day_of_week">Första veckodagen</string> 206 + <string name="settings_repeat_button_type">Upprepa knapp</string> 207 + <string name="settings_repeat_last_record">Upprepa senaste posten</string> 208 + <string name="settings_repeat_one_before_last">Upprepa posten innan sist</string> 206 209 <string name="settings_show_untracked_time">Visa okategoriserad tid i händelselistan</string> 207 210 <string name="settings_show_untracked_time_statistics">Visa okategoriserad tid i statistiken</string> 208 211 <string name="settings_ignore_short_untracked">Ignorera kort ospårad tid</string>
+6 -3
core/src/main/res/values-tr/strings.xml
··· 189 189 <string name="running_records_add_type">Ekle</string> 190 190 <string name="running_records_add_filter">Filtre ekle</string> 191 191 <string name="running_records_add_default">Varsayılan</string> 192 - <string name="running_records_restart">Tekrarlamak</string> 193 - <string name="running_records_restart_no_prev_record">Yeniden başlatılacak önceki kayıt yok</string> 194 - <string name="running_records_restart_already_tracking">Bu etkinliği zaten izliyorum</string> 192 + <string name="running_records_repeat">Tekrarlamak</string> 193 + <string name="running_records_repeat_no_prev_record">Yeniden başlatılacak önceki kayıt yok</string> 194 + <string name="running_records_repeat_already_tracking">Bu etkinliği zaten izliyorum</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Görüntü ayarları</string> ··· 203 203 <string name="settings_sort_by_color">Renk</string> 204 204 <string name="settings_sort_manually">Elle</string> 205 205 <string name="settings_first_day_of_week">Haftanın ilk günü</string> 206 + <string name="settings_repeat_button_type">Tekrar düğmesi</string> 207 + <string name="settings_repeat_last_record">Son kaydı tekrarla</string> 208 + <string name="settings_repeat_one_before_last">Sondan önceki kaydı tekrarla</string> 206 209 <string name="settings_show_untracked_time">Kayıtlarda takipsiz zamanı göster</string> 207 210 <string name="settings_show_untracked_time_statistics">İstatistiklerde takipsiz zamanı göster</string> 208 211 <string name="settings_ignore_short_untracked">Takip edilmeyen kısa süreyi yoksay</string>
+6 -3
core/src/main/res/values-uk/strings.xml
··· 189 189 <string name="running_records_add_type">Додати</string> 190 190 <string name="running_records_add_filter">Додайте фільтр</string> 191 191 <string name="running_records_add_default">За замовчуванням</string> 192 - <string name="running_records_restart">Повторіть</string> 193 - <string name="running_records_restart_no_prev_record">Немає попереднього запису для повторного запуску</string> 194 - <string name="running_records_restart_already_tracking">Уже відстежуєте цю діяльність</string> 192 + <string name="running_records_repeat">Повторіть</string> 193 + <string name="running_records_repeat_no_prev_record">Немає попереднього запису для повторного запуску</string> 194 + <string name="running_records_repeat_already_tracking">Уже відстежуєте цю діяльність</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Налаштування дисплея</string> ··· 203 203 <string name="settings_sort_by_color">Колір</string> 204 204 <string name="settings_sort_manually">Вручну</string> 205 205 <string name="settings_first_day_of_week">Перший день тижня</string> 206 + <string name="settings_repeat_button_type">Кнопка повтору</string> 207 + <string name="settings_repeat_last_record">Повторити останній запис</string> 208 + <string name="settings_repeat_one_before_last">Повторіть передостанній запис</string> 206 209 <string name="settings_show_untracked_time">Показувати не відстежений час у записах</string> 207 210 <string name="settings_show_untracked_time_statistics">Показувати не відстежений час у статистиці</string> 208 211 <string name="settings_ignore_short_untracked">Ігноруйте короткий невідстежуваний час</string>
+6 -3
core/src/main/res/values-zh-rTW/strings.xml
··· 189 189 <string name="running_records_add_type">新增</string> 190 190 <string name="running_records_add_filter">新增過濾</string> 191 191 <string name="running_records_add_default">默認</string> 192 - <string name="running_records_restart">重複</string> 193 - <string name="running_records_restart_no_prev_record">沒有之前的記錄可以重新啟動</string> 194 - <string name="running_records_restart_already_tracking">已經在追踪此活動</string> 192 + <string name="running_records_repeat">重複</string> 193 + <string name="running_records_repeat_no_prev_record">沒有之前的記錄可以重新啟動</string> 194 + <string name="running_records_repeat_already_tracking">已經在追踪此活動</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">顯示設定</string> ··· 203 203 <string name="settings_sort_by_color">顏色</string> 204 204 <string name="settings_sort_manually">手動</string> 205 205 <string name="settings_first_day_of_week">每周第一天</string> 206 + <string name="settings_repeat_button_type">重複按鈕</string> 207 + <string name="settings_repeat_last_record">重複上次記錄</string> 208 + <string name="settings_repeat_one_before_last">重複上次之前的記錄</string> 206 209 <string name="settings_show_untracked_time">顯示紀錄未追蹤時間</string> 207 210 <string name="settings_show_untracked_time_statistics">在統計中顯示未跟踪的時間</string> 208 211 <string name="settings_ignore_short_untracked">忽略短的未跟踪時間</string>
+6 -3
core/src/main/res/values-zh/strings.xml
··· 189 189 <string name="running_records_add_type">添加</string> 190 190 <string name="running_records_add_filter">添加过滤器</string> 191 191 <string name="running_records_add_default">默认</string> 192 - <string name="running_records_restart">重复</string> 193 - <string name="running_records_restart_no_prev_record">没有之前的记录可以重新启动</string> 194 - <string name="running_records_restart_already_tracking">已经在追踪此活动</string> 192 + <string name="running_records_repeat">重复</string> 193 + <string name="running_records_repeat_no_prev_record">没有之前的记录可以重新启动</string> 194 + <string name="running_records_repeat_already_tracking">已经在追踪此活动</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">显示设置</string> ··· 203 203 <string name="settings_sort_by_color">颜色</string> 204 204 <string name="settings_sort_manually">手动</string> 205 205 <string name="settings_first_day_of_week">一周的第一天</string> 206 + <string name="settings_repeat_button_type">重复按钮</string> 207 + <string name="settings_repeat_last_record">重复上次记录</string> 208 + <string name="settings_repeat_one_before_last">重复上次之前的记录</string> 206 209 <string name="settings_show_untracked_time">在记录中显示未追踪的时间</string> 207 210 <string name="settings_show_untracked_time_statistics">在统计中显示未跟踪的时间</string> 208 211 <string name="settings_ignore_short_untracked">忽略短的未跟踪时间</string>
+6 -3
core/src/main/res/values/strings.xml
··· 189 189 <string name="running_records_add_type">Add</string> 190 190 <string name="running_records_add_filter">Add filter</string> 191 191 <string name="running_records_add_default">Default</string> 192 - <string name="running_records_restart">Repeat</string> 193 - <string name="running_records_restart_no_prev_record">No previous record to restart</string> 194 - <string name="running_records_restart_already_tracking">Already tracking this activity</string> 192 + <string name="running_records_repeat">Repeat</string> 193 + <string name="running_records_repeat_no_prev_record">No previous record to restart</string> 194 + <string name="running_records_repeat_already_tracking">Already tracking this activity</string> 195 195 196 196 <!-- Settings --> 197 197 <string name="settings_display_title">Display settings</string> ··· 203 203 <string name="settings_sort_by_color">Color</string> 204 204 <string name="settings_sort_manually">Manually</string> 205 205 <string name="settings_first_day_of_week">First day of week</string> 206 + <string name="settings_repeat_button_type">Repeat button</string> 207 + <string name="settings_repeat_last_record">Repeat last record</string> 208 + <string name="settings_repeat_one_before_last">Repeat record before last</string> 206 209 <string name="settings_show_untracked_time">Show untracked time in records</string> 207 210 <string name="settings_show_untracked_time_statistics">Show untracked time in statistics</string> 208 211 <string name="settings_ignore_short_untracked">Ignore short untracked time</string>
+47
features/feature_settings/src/main/res/layout/settings_additional_layout.xml
··· 292 292 293 293 <androidx.constraintlayout.widget.ConstraintLayout 294 294 android:layout_width="match_parent" 295 + android:layout_height="wrap_content"> 296 + 297 + <androidx.appcompat.widget.AppCompatTextView 298 + android:id="@+id/tvSettingsRepeatButtonType" 299 + style="@style/SettingsText" 300 + android:layout_width="0dp" 301 + android:layout_height="wrap_content" 302 + android:text="@string/settings_repeat_button_type" 303 + app:layout_constraintBottom_toBottomOf="parent" 304 + app:layout_constraintEnd_toStartOf="@id/tvSettingsRepeatButtonTypeValue" 305 + app:layout_constraintStart_toStartOf="parent" 306 + app:layout_constraintTop_toTopOf="parent" /> 307 + 308 + <androidx.appcompat.widget.AppCompatTextView 309 + android:id="@+id/tvSettingsRepeatButtonTypeValue" 310 + android:layout_width="0dp" 311 + android:layout_height="wrap_content" 312 + android:layout_marginEnd="32dp" 313 + android:gravity="end|center_vertical" 314 + android:paddingStart="8dp" 315 + android:paddingTop="12dp" 316 + android:paddingEnd="8dp" 317 + android:paddingBottom="12dp" 318 + android:textColor="?appTextPrimaryColor" 319 + app:layout_constraintBottom_toBottomOf="@id/spinnerSettingsRepeatButtonType" 320 + app:layout_constraintEnd_toEndOf="@id/spinnerSettingsRepeatButtonType" 321 + app:layout_constraintStart_toEndOf="@id/tvSettingsRepeatButtonType" 322 + app:layout_constraintTop_toTopOf="@id/spinnerSettingsRepeatButtonType" 323 + tools:text="@string/settings_repeat_last_record" /> 324 + 325 + <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 326 + android:id="@+id/spinnerSettingsRepeatButtonType" 327 + android:layout_width="wrap_content" 328 + android:layout_height="0dp" 329 + android:layout_marginEnd="8dp" 330 + app:layout_constraintBottom_toBottomOf="@id/tvSettingsRepeatButtonType" 331 + app:layout_constraintEnd_toEndOf="parent" 332 + app:layout_constraintTop_toTopOf="@id/tvSettingsRepeatButtonType" /> 333 + 334 + </androidx.constraintlayout.widget.ConstraintLayout> 335 + 336 + <View 337 + style="@style/SettingsDivider" 338 + android:layout_width="match_parent" /> 339 + 340 + <androidx.constraintlayout.widget.ConstraintLayout 341 + android:layout_width="match_parent" 295 342 android:layout_height="wrap_content" 296 343 android:clipToPadding="false" 297 344 android:paddingTop="12dp">
+59
core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordRepeatInteractor.kt
··· 1 + package com.example.util.simpletimetracker.core.interactor 2 + 3 + import com.example.util.simpletimetracker.core.R 4 + import com.example.util.simpletimetracker.core.repo.ResourceRepo 5 + import com.example.util.simpletimetracker.domain.interactor.AddRunningRecordMediator 6 + import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 7 + import com.example.util.simpletimetracker.domain.interactor.RecordInteractor 8 + import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor 9 + import com.example.util.simpletimetracker.domain.model.RepeatButtonType 10 + import com.example.util.simpletimetracker.navigation.Router 11 + import com.example.util.simpletimetracker.navigation.params.notification.SnackBarParams 12 + import javax.inject.Inject 13 + 14 + class RecordRepeatInteractor @Inject constructor( 15 + private val recordInteractor: RecordInteractor, 16 + private val runningRecordInteractor: RunningRecordInteractor, 17 + private val addRunningRecordMediator: AddRunningRecordMediator, 18 + private val prefsInteractor: PrefsInteractor, 19 + private val router: Router, 20 + private val resourceRepo: ResourceRepo, 21 + ) { 22 + 23 + suspend fun shouldShowButton(): Boolean { 24 + return !recordInteractor.isEmpty() 25 + } 26 + 27 + suspend fun execute() { 28 + val type = prefsInteractor.getRepeatButtonType() 29 + 30 + val prevRecord = recordInteractor.getPrev( 31 + timeStarted = System.currentTimeMillis(), 32 + limit = 2, 33 + ).let { 34 + when (type) { 35 + is RepeatButtonType.RepeatLast -> it.getOrNull(0) 36 + is RepeatButtonType.RepeatBeforeLast -> it.getOrNull(1) 37 + } 38 + } ?: run { 39 + SnackBarParams( 40 + message = resourceRepo.getString(R.string.running_records_repeat_no_prev_record), 41 + duration = SnackBarParams.Duration.Short, 42 + ).let(router::show) 43 + return 44 + } 45 + if (runningRecordInteractor.get(prevRecord.typeId) != null) { 46 + SnackBarParams( 47 + message = resourceRepo.getString(R.string.running_records_repeat_already_tracking), 48 + duration = SnackBarParams.Duration.Short, 49 + ).let(router::show) 50 + return 51 + } 52 + 53 + addRunningRecordMediator.startTimer( 54 + typeId = prevRecord.typeId, 55 + tagIds = prevRecord.tagIds, 56 + comment = prevRecord.comment, 57 + ) 58 + } 59 + }
-42
core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordRestartInteractor.kt
··· 1 - package com.example.util.simpletimetracker.core.interactor 2 - 3 - import com.example.util.simpletimetracker.core.R 4 - import com.example.util.simpletimetracker.core.repo.ResourceRepo 5 - import com.example.util.simpletimetracker.domain.interactor.AddRunningRecordMediator 6 - import com.example.util.simpletimetracker.domain.interactor.RecordInteractor 7 - import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor 8 - import com.example.util.simpletimetracker.navigation.Router 9 - import com.example.util.simpletimetracker.navigation.params.notification.SnackBarParams 10 - import javax.inject.Inject 11 - 12 - class RecordRestartInteractor @Inject constructor( 13 - private val recordInteractor: RecordInteractor, 14 - private val runningRecordInteractor: RunningRecordInteractor, 15 - private val addRunningRecordMediator: AddRunningRecordMediator, 16 - private val router: Router, 17 - private val resourceRepo: ResourceRepo, 18 - ) { 19 - 20 - suspend fun execute() { 21 - val prevRecord = recordInteractor.getPrev(System.currentTimeMillis()) ?: run { 22 - SnackBarParams( 23 - message = resourceRepo.getString(R.string.running_records_restart_no_prev_record), 24 - duration = SnackBarParams.Duration.Short, 25 - ).let(router::show) 26 - return 27 - } 28 - if (runningRecordInteractor.get(prevRecord.typeId) != null) { 29 - SnackBarParams( 30 - message = resourceRepo.getString(R.string.running_records_restart_already_tracking), 31 - duration = SnackBarParams.Duration.Short, 32 - ).let(router::show) 33 - return 34 - } 35 - 36 - addRunningRecordMediator.startTimer( 37 - typeId = prevRecord.typeId, 38 - tagIds = prevRecord.tagIds, 39 - comment = prevRecord.comment, 40 - ) 41 - } 42 - }
+2 -2
data_local/src/main/java/com/example/util/simpletimetracker/data_local/database/RecordDao.kt
··· 52 52 suspend fun getFromRangeByType(typesIds: List<Long>, start: Long, end: Long): List<RecordWithRecordTagsDBO> 53 53 54 54 @Transaction 55 - @Query("SELECT * FROM records WHERE time_ended <= :timeStarted ORDER BY time_ended DESC LIMIT 1") 56 - suspend fun getPrev(timeStarted: Long): RecordWithRecordTagsDBO? 55 + @Query("SELECT * FROM records WHERE time_ended <= :timeStarted ORDER BY time_ended DESC LIMIT :limit") 56 + suspend fun getPrev(timeStarted: Long, limit: Long): List<RecordWithRecordTagsDBO> 57 57 58 58 @Transaction 59 59 @Query("SELECT * FROM records WHERE time_started >= :timeEnded ORDER BY time_started ASC LIMIT 1")
+5
data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/PrefsRepoImpl.kt
··· 237 237 KEY_AUTOMATIC_EXPORT_LAST_SAVE_TIME, 0 238 238 ) 239 239 240 + override var repeatButtonType: Int by prefs.delegate( 241 + KEY_REPEAT_BUTTON_TYPE, 0 242 + ) 243 + 240 244 override fun setWidget(widgetId: Int, recordType: Long) { 241 245 prefs.edit().putLong(KEY_WIDGET + widgetId, recordType).apply() 242 246 } ··· 429 433 private const val KEY_AUTOMATIC_EXPORT_URI = "automaticExportUri" 430 434 private const val KEY_AUTOMATIC_EXPORT_ERROR = "automaticExportError" 431 435 private const val KEY_AUTOMATIC_EXPORT_LAST_SAVE_TIME = "automaticExportLastSaveTime" 436 + private const val KEY_REPEAT_BUTTON_TYPE = "repeatButtonType" 432 437 private const val KEY_WIDGET = "widget_" 433 438 private const val KEY_STATISTICS_WIDGET_FILTERED_TYPES = "statistics_widget_filtered_types_" 434 439 private const val KEY_STATISTICS_WIDGET_FILTERED_CATEGORIES = "statistics_widget_filtered_categories_"
+3 -3
data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/RecordRepoImpl.kt
··· 83 83 .map(recordDataLocalMapper::map) 84 84 } 85 85 86 - override suspend fun getPrev(timeStarted: Long): Record? = 86 + override suspend fun getPrev(timeStarted: Long, limit: Long): List<Record> = 87 87 withContext(Dispatchers.IO) { 88 88 Timber.d("getPrev") 89 - recordDao.getPrev(timeStarted) 90 - ?.let(recordDataLocalMapper::map) 89 + recordDao.getPrev(timeStarted, limit) 90 + .map(recordDataLocalMapper::map) 91 91 } 92 92 93 93 override suspend fun getNext(timeEnded: Long): Record? =
+16
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/PrefsInteractor.kt
··· 7 7 import com.example.util.simpletimetracker.domain.model.QuickSettingsWidgetType 8 8 import com.example.util.simpletimetracker.domain.model.Range 9 9 import com.example.util.simpletimetracker.domain.model.RangeLength 10 + import com.example.util.simpletimetracker.domain.model.RepeatButtonType 10 11 import com.example.util.simpletimetracker.domain.model.StatisticsWidgetData 11 12 import com.example.util.simpletimetracker.domain.repo.PrefsRepo 12 13 import kotlinx.coroutines.Dispatchers ··· 541 542 542 543 suspend fun getAutomaticExportLastSaveTime(): Long = withContext(Dispatchers.IO) { 543 544 prefsRepo.automaticExportLastSaveTime 545 + } 546 + 547 + suspend fun getRepeatButtonType(): RepeatButtonType = withContext(Dispatchers.IO) { 548 + when (prefsRepo.repeatButtonType) { 549 + 0 -> RepeatButtonType.RepeatLast 550 + 1 -> RepeatButtonType.RepeatBeforeLast 551 + else -> RepeatButtonType.RepeatLast 552 + } 553 + } 554 + 555 + suspend fun setRepeatButtonType(mode: RepeatButtonType) = withContext(Dispatchers.IO) { 556 + prefsRepo.repeatButtonType = when (mode) { 557 + RepeatButtonType.RepeatLast -> 0 558 + RepeatButtonType.RepeatBeforeLast -> 1 559 + } 544 560 } 545 561 546 562 suspend fun clear() = withContext(Dispatchers.IO) {
+2 -2
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/RecordInteractor.kt
··· 43 43 return recordRepo.get(id) 44 44 } 45 45 46 - suspend fun getPrev(timeStarted: Long): Record? { 47 - return recordRepo.getPrev(timeStarted) 46 + suspend fun getPrev(timeStarted: Long, limit: Long): List<Record> { 47 + return recordRepo.getPrev(timeStarted, limit) 48 48 } 49 49 50 50 suspend fun getNext(timeEnded: Long): Record? {
+6
domain/src/main/java/com/example/util/simpletimetracker/domain/model/RepeatButtonType.kt
··· 1 + package com.example.util.simpletimetracker.domain.model 2 + 3 + sealed interface RepeatButtonType { 4 + object RepeatLast : RepeatButtonType 5 + object RepeatBeforeLast : RepeatButtonType 6 + }
+2
domain/src/main/java/com/example/util/simpletimetracker/domain/repo/PrefsRepo.kt
··· 109 109 110 110 var automaticExportLastSaveTime: Long 111 111 112 + var repeatButtonType: Int 113 + 112 114 fun setWidget(widgetId: Int, recordType: Long) 113 115 114 116 fun getWidget(widgetId: Int): Long
+1 -1
domain/src/main/java/com/example/util/simpletimetracker/domain/repo/RecordRepo.kt
··· 25 25 26 26 suspend fun getFromRangeByType(typeIds: List<Long>, range: Range): List<Record> 27 27 28 - suspend fun getPrev(timeStarted: Long): Record? 28 + suspend fun getPrev(timeStarted: Long, limit: Long): List<Record> 29 29 30 30 suspend fun getNext(timeEnded: Long): Record? 31 31
+1 -1
features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt
··· 598 598 } 599 599 600 600 private suspend fun initializePrevNextRecords() { 601 - prevRecord = recordInteractor.getPrev(timeStarted = originalTimeStarted) 601 + prevRecord = recordInteractor.getPrev(timeStarted = originalTimeStarted, limit = 1).firstOrNull() 602 602 nextRecord = recordInteractor.getNext(timeEnded = originalTimeEnded) 603 603 } 604 604
+5 -5
features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/interactor/RunningRecordsViewDataInteractor.kt
··· 2 2 3 3 import com.example.util.simpletimetracker.core.interactor.ActivityFilterViewDataInteractor 4 4 import com.example.util.simpletimetracker.core.interactor.GetRunningRecordViewDataMediator 5 + import com.example.util.simpletimetracker.core.interactor.RecordRepeatInteractor 5 6 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 6 - import com.example.util.simpletimetracker.domain.interactor.RecordInteractor 7 7 import com.example.util.simpletimetracker.domain.interactor.RecordTagInteractor 8 8 import com.example.util.simpletimetracker.domain.interactor.RecordTypeGoalInteractor 9 9 import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor ··· 21 21 private val recordTypeInteractor: RecordTypeInteractor, 22 22 private val recordTagInteractor: RecordTagInteractor, 23 23 private val recordTypeGoalInteractor: RecordTypeGoalInteractor, 24 - private val recordInteractor: RecordInteractor, 24 + private val recordRepeatInteractor: RecordRepeatInteractor, 25 25 private val runningRecordInteractor: RunningRecordInteractor, 26 26 private val activityFilterViewDataInteractor: ActivityFilterViewDataInteractor, 27 27 private val mapper: RunningRecordsViewDataMapper, ··· 41 41 val showSeconds = prefsInteractor.getShowSeconds() 42 42 val useProportionalMinutes = prefsInteractor.getUseProportionalMinutes() 43 43 val showFirstEnterHint = recordTypes.filterNot(RecordType::hidden).isEmpty() 44 - val hasPreviousRecord = recordInteractor.getPrev(System.currentTimeMillis()) != null 44 + val showRepeatButton = recordRepeatInteractor.shouldShowButton() 45 45 46 46 val runningRecordsViewData = when { 47 47 showFirstEnterHint -> ··· 99 99 .let { data -> 100 100 mutableListOf<ViewHolderType>().apply { 101 101 data.let(::addAll) 102 - if (hasPreviousRecord) { 103 - mapper.mapToRestartItem( 102 + if (showRepeatButton) { 103 + mapper.mapToRepeatItem( 104 104 numberOfCards = numberOfCards, 105 105 isDarkTheme = isDarkTheme, 106 106 ).let(::add)
+4 -4
features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordsViewDataMapper.kt
··· 87 87 ) 88 88 } 89 89 90 - fun mapToRestartItem( 90 + fun mapToRepeatItem( 91 91 numberOfCards: Int, 92 92 isDarkTheme: Boolean, 93 93 ): RunningRecordTypeSpecialViewData { 94 94 return mapToSpecial( 95 - type = RunningRecordTypeSpecialViewData.Type.Restart, 96 - name = R.string.running_records_restart, 97 - icon = RecordTypeIcon.Image(R.drawable.restart), 95 + type = RunningRecordTypeSpecialViewData.Type.Repeat, 96 + name = R.string.running_records_repeat, 97 + icon = RecordTypeIcon.Image(R.drawable.repeat), 98 98 numberOfCards = numberOfCards, 99 99 isDarkTheme = isDarkTheme, 100 100 )
+1 -1
features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/viewData/RunningRecordTypeSpecialViewData.kt
··· 21 21 sealed interface Type { 22 22 object Add : Type 23 23 object Default : Type 24 - object Restart : Type 24 + object Repeat : Type 25 25 } 26 26 }
+4 -4
features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/viewModel/RunningRecordsViewModel.kt
··· 7 7 import com.example.util.simpletimetracker.core.base.SingleLiveEvent 8 8 import com.example.util.simpletimetracker.core.extension.set 9 9 import com.example.util.simpletimetracker.core.extension.toParams 10 - import com.example.util.simpletimetracker.core.interactor.RecordRestartInteractor 10 + import com.example.util.simpletimetracker.core.interactor.RecordRepeatInteractor 11 11 import com.example.util.simpletimetracker.core.model.NavigationTab 12 12 import com.example.util.simpletimetracker.domain.interactor.ActivityFilterInteractor 13 13 import com.example.util.simpletimetracker.domain.interactor.AddRunningRecordMediator ··· 42 42 private val addRunningRecordMediator: AddRunningRecordMediator, 43 43 private val removeRunningRecordMediator: RemoveRunningRecordMediator, 44 44 private val runningRecordInteractor: RunningRecordInteractor, 45 - private val recordRestartInteractor: RecordRestartInteractor, 45 + private val recordRepeatInteractor: RecordRepeatInteractor, 46 46 private val runningRecordsViewDataInteractor: RunningRecordsViewDataInteractor, 47 47 private val activityFilterInteractor: ActivityFilterInteractor, 48 48 ) : ViewModel() { ··· 110 110 data = DefaultTypesSelectionDialogParams, 111 111 ) 112 112 } 113 - is RunningRecordTypeSpecialViewData.Type.Restart -> viewModelScope.launch { 114 - recordRestartInteractor.execute() 113 + is RunningRecordTypeSpecialViewData.Type.Repeat -> viewModelScope.launch { 114 + recordRepeatInteractor.execute() 115 115 } 116 116 } 117 117 }
+38 -9
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt
··· 21 21 import com.example.util.simpletimetracker.domain.model.CardOrder 22 22 import com.example.util.simpletimetracker.domain.model.DayOfWeek 23 23 import com.example.util.simpletimetracker.domain.model.DaysInCalendar 24 + import com.example.util.simpletimetracker.domain.model.RepeatButtonType 24 25 import com.example.util.simpletimetracker.domain.model.count 25 26 import com.example.util.simpletimetracker.feature_settings.R 26 27 import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTranslatorViewData ··· 29 30 import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 30 31 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 31 32 import com.example.util.simpletimetracker.feature_settings.viewData.LanguageViewData 33 + import com.example.util.simpletimetracker.feature_settings.viewData.RepeatButtonViewData 32 34 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 33 35 import com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 34 36 import com.example.util.simpletimetracker.navigation.params.screen.HelpDialogParams ··· 47 49 private val cardOrderList: List<CardOrder> = listOf( 48 50 CardOrder.NAME, 49 51 CardOrder.COLOR, 50 - CardOrder.MANUAL 52 + CardOrder.MANUAL, 51 53 ) 52 54 53 55 private val daysInCalendarList: List<DaysInCalendar> = listOf( ··· 64 66 DayOfWeek.THURSDAY, 65 67 DayOfWeek.FRIDAY, 66 68 DayOfWeek.SATURDAY, 67 - DayOfWeek.SUNDAY 69 + DayOfWeek.SUNDAY, 70 + ) 71 + 72 + private val repeatButtonList: List<RepeatButtonType> = listOf( 73 + RepeatButtonType.RepeatLast, 74 + RepeatButtonType.RepeatBeforeLast, 68 75 ) 69 76 70 77 private val darkModeList: List<DarkMode> = listOf( ··· 77 84 return HelpDialogParams( 78 85 title = resourceRepo.getString(R.string.settings_automated_tracking), 79 86 text = resourceRepo.getString( 80 - R.string.settings_automated_tracking_text 87 + R.string.settings_automated_tracking_text, 81 88 ).format( 82 89 ACTION_START_ACTIVITY, 83 90 ACTION_STOP_ACTIVITY, ··· 90 97 ACTION_STOP_LONGEST_ACTIVITY, 91 98 ACTION_RESTART_ACTIVITY, 92 99 ) + "<br/>" + resourceRepo.getString( 93 - R.string.settings_automated_tracking_send_events_text 100 + R.string.settings_automated_tracking_send_events_text, 94 101 ).format( 95 102 resourceRepo.getString(R.string.settings_automated_tracking_send_events), 96 103 EVENT_STARTED_ACTIVITY, ··· 108 115 .map(::toCardOrderName) 109 116 .map(CustomSpinner::CustomSpinnerTextItem), 110 117 selectedPosition = toPosition(currentOrder), 111 - isManualConfigButtonVisible = currentOrder == CardOrder.MANUAL 118 + isManualConfigButtonVisible = currentOrder == CardOrder.MANUAL, 112 119 ) 113 120 } 114 121 ··· 134 141 items = dayOfWeekList 135 142 .map(timeMapper::toShortDayOfWeekName) 136 143 .map(CustomSpinner::CustomSpinnerTextItem), 137 - selectedPosition = toPosition(currentOrder) 144 + selectedPosition = toPosition(currentOrder), 138 145 ) 139 146 } 140 147 141 148 fun toDayOfWeek(position: Int): DayOfWeek { 142 149 return dayOfWeekList.getOrElse(position) { dayOfWeekList.first() } 150 + } 151 + 152 + fun toRepeatButtonViewData(currentType: RepeatButtonType): RepeatButtonViewData { 153 + return RepeatButtonViewData( 154 + items = repeatButtonList 155 + .map { 156 + when (it) { 157 + is RepeatButtonType.RepeatLast -> R.string.settings_repeat_last_record 158 + is RepeatButtonType.RepeatBeforeLast -> R.string.settings_repeat_one_before_last 159 + }.let(resourceRepo::getString) 160 + } 161 + .map(CustomSpinner::CustomSpinnerTextItem), 162 + selectedPosition = toPosition(currentType), 163 + ) 164 + } 165 + 166 + fun toRepeatButtonType(position: Int): RepeatButtonType { 167 + return repeatButtonList.getOrElse(position) { repeatButtonList.first() } 143 168 } 144 169 145 170 fun toDarkModeViewData(currentMode: DarkMode): DarkModeViewData { ··· 153 178 }.let(resourceRepo::getString) 154 179 } 155 180 .map(CustomSpinner::CustomSpinnerTextItem), 156 - selectedPosition = toPosition(currentMode) 181 + selectedPosition = toPosition(currentMode), 157 182 ) 158 183 } 159 184 ··· 256 281 return timeMapper.formatInterval( 257 282 interval = 4500000, 258 283 forceSeconds = false, 259 - useProportionalMinutes = useProportionalMinutes 284 + useProportionalMinutes = useProportionalMinutes, 260 285 ) 261 286 } 262 287 ··· 268 293 .map { 269 294 SettingsTranslatorViewData( 270 295 translator = languageInteractor.getTranslators(it), 271 - language = languageInteractor.getDisplayName(it) 296 + language = languageInteractor.getDisplayName(it), 272 297 ) 273 298 } 274 299 } ··· 295 320 296 321 private fun toPosition(dayOfWeek: DayOfWeek): Int { 297 322 return dayOfWeekList.indexOf(dayOfWeek).takeUnless { it == -1 }.orZero() 323 + } 324 + 325 + private fun toPosition(repeatButtonType: RepeatButtonType): Int { 326 + return repeatButtonList.indexOf(repeatButtonType).takeUnless { it == -1 }.orZero() 298 327 } 299 328 300 329 private fun toPosition(darkMode: DarkMode): Int {
+13
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 21 21 import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 22 22 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 23 23 import com.example.util.simpletimetracker.feature_settings.viewData.LanguageViewData 24 + import com.example.util.simpletimetracker.feature_settings.viewData.RepeatButtonViewData 24 25 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 25 26 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsStartOfDayViewData 26 27 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsUntrackedRangeViewData ··· 67 68 layoutSettingsDisplay.spinnerSettingsDaysInCalendar.setProcessSameItemSelection(false) 68 69 layoutSettingsDisplay.spinnerSettingsRecordTypeSort.setProcessSameItemSelection(false) 69 70 layoutSettingsAdditional.spinnerSettingsFirstDayOfWeek.setProcessSameItemSelection(false) 71 + layoutSettingsAdditional.spinnerSettingsRepeatButtonType.setProcessSameItemSelection(false) 70 72 } 71 73 72 74 override fun initUx() = with(binding) { ··· 126 128 with(viewModel.additionalDelegate) { 127 129 layoutSettingsAdditionalTitle.setOnClick(viewModel::onSettingsAdditionalClick) 128 130 spinnerSettingsFirstDayOfWeek.onPositionSelected = ::onFirstDayOfWeekSelected 131 + spinnerSettingsRepeatButtonType.onPositionSelected = ::onRepeatButtonSelected 129 132 groupSettingsStartOfDay.setOnClick(::onStartOfDayClicked) 130 133 btnSettingsStartOfDaySign.setOnClick(::onStartOfDaySignClicked) 131 134 checkboxSettingsKeepStatisticsRange.setOnClick(::onKeepStatisticsRangeClicked) ··· 242 245 recordTagSelectionForGeneralTagsCheckbox.observe(checkboxSettingsRecordTagSelectionGeneral::setChecked) 243 246 automatedTrackingSendEventsCheckbox.observe(checkboxSettingsAutomatedTrackingSend::setChecked) 244 247 firstDayOfWeekViewData.observe(::updateFirstDayOfWeekViewData) 248 + repeatButtonViewData.observe(::updateRepeatButtonViewData) 245 249 startOfDayViewData.observe(::updateStartOfDayViewData) 246 250 showRecordTagSelectionCheckbox.observe(::updateShowRecordTagSelectionChecked) 247 251 } ··· 308 312 } 309 313 with(layoutSettingsAdditional) { 310 314 spinnerSettingsFirstDayOfWeek.jumpDrawablesToCurrentState() 315 + spinnerSettingsRepeatButtonType.jumpDrawablesToCurrentState() 311 316 checkboxSettingsKeepStatisticsRange.jumpDrawablesToCurrentState() 312 317 checkboxSettingsShowRecordTagSelection.jumpDrawablesToCurrentState() 313 318 checkboxSettingsRecordTagSelectionClose.jumpDrawablesToCurrentState() ··· 363 368 ) = with(binding.layoutSettingsAdditional) { 364 369 spinnerSettingsFirstDayOfWeek.setData(viewData.items, viewData.selectedPosition) 365 370 tvSettingsFirstDayOfWeekValue.text = viewData.items 371 + .getOrNull(viewData.selectedPosition)?.text.orEmpty() 372 + } 373 + 374 + private fun updateRepeatButtonViewData( 375 + viewData: RepeatButtonViewData, 376 + ) = with(binding.layoutSettingsAdditional) { 377 + spinnerSettingsRepeatButtonType.setData(viewData.items, viewData.selectedPosition) 378 + tvSettingsRepeatButtonTypeValue.text = viewData.items 366 379 .getOrNull(viewData.selectedPosition)?.text.orEmpty() 367 380 } 368 381
+8
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewData/RepeatButtonViewData.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 RepeatButtonViewData( 6 + val items: List<CustomSpinner.CustomSpinnerItem>, 7 + val selectedPosition: Int 8 + )
+8 -6
features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/interactor/ActivityStartStopFromBroadcastInteractor.kt
··· 1 1 package com.example.util.simpletimetracker.feature_notification.recordType.interactor 2 2 3 3 import com.example.util.simpletimetracker.domain.interactor.AddRunningRecordMediator 4 + import com.example.util.simpletimetracker.domain.interactor.NotificationTypeInteractor 4 5 import com.example.util.simpletimetracker.domain.interactor.RecordInteractor 5 6 import com.example.util.simpletimetracker.domain.interactor.RecordTagInteractor 6 7 import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor 7 8 import com.example.util.simpletimetracker.domain.interactor.RemoveRunningRecordMediator 8 9 import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor 9 - import com.example.util.simpletimetracker.domain.interactor.NotificationTypeInteractor 10 10 import javax.inject.Inject 11 11 12 12 class ActivityStartStopFromBroadcastInteractor @Inject constructor( ··· 50 50 ?: return // Not running. 51 51 52 52 removeRunningRecordMediator.removeWithRecordAdd( 53 - runningRecord = runningRecord 53 + runningRecord = runningRecord, 54 54 ) 55 55 } 56 56 ··· 75 75 comment: String?, 76 76 tagName: String?, 77 77 ) { 78 - val previousRecord = recordInteractor.getPrev(System.currentTimeMillis()) 79 - ?: return 78 + val previousRecord = recordInteractor.getPrev( 79 + timeStarted = System.currentTimeMillis(), 80 + limit = 1, 81 + ).firstOrNull() ?: return 80 82 val typeId = previousRecord.typeId 81 83 val tagId = findTagIdByName(tagName, typeId) 82 84 ··· 105 107 if (started) { 106 108 notificationTypeInteractor.checkAndShow( 107 109 typeId = typeId, 108 - typesShift = typesShift 110 + typesShift = typesShift, 109 111 ) 110 112 } 111 113 } ··· 123 125 ) 124 126 notificationTypeInteractor.checkAndShow( 125 127 typeId = typeId, 126 - typesShift = typesShift 128 + typesShift = typesShift, 127 129 ) 128 130 } 129 131
+22 -3
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsAdditionalViewModelDelegate.kt
··· 1 1 package com.example.util.simpletimetracker.feature_settings.viewModel.delegate 2 2 3 3 import androidx.lifecycle.LiveData 4 - import androidx.lifecycle.MutableLiveData 5 4 import com.example.util.simpletimetracker.core.base.ViewModelDelegate 6 5 import com.example.util.simpletimetracker.core.extension.lazySuspend 7 6 import com.example.util.simpletimetracker.core.extension.set ··· 15 14 import com.example.util.simpletimetracker.feature_settings.R 16 15 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 17 16 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 17 + import com.example.util.simpletimetracker.feature_settings.viewData.RepeatButtonViewData 18 18 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsStartOfDayViewData 19 19 import com.example.util.simpletimetracker.feature_settings.viewModel.SettingsViewModel 20 20 import com.example.util.simpletimetracker.navigation.Router ··· 35 35 36 36 val firstDayOfWeekViewData: LiveData<FirstDayOfWeekViewData> 37 37 by lazySuspend { loadFirstDayOfWeekViewData() } 38 + val repeatButtonViewData: LiveData<RepeatButtonViewData> 39 + by lazySuspend { loadRepeatButtonViewData() } 38 40 val keepStatisticsRangeCheckbox: LiveData<Boolean> 39 41 by lazySuspend { prefsInteractor.getKeepStatisticsRange() } 40 42 val startOfDayViewData: LiveData<SettingsStartOfDayViewData> ··· 78 80 widgetInteractor.updateWidgets(listOf(WidgetType.STATISTICS_CHART)) 79 81 notificationGoalTimeInteractor.checkAndReschedule() 80 82 updateFirstDayOfWeekViewData() 83 + } 84 + } 85 + 86 + fun onRepeatButtonSelected(position: Int) { 87 + val newType = settingsMapper.toRepeatButtonType(position) 88 + 89 + delegateScope.launch { 90 + prefsInteractor.setRepeatButtonType(newType) 91 + updateRepeatButtonViewData() 81 92 } 82 93 } 83 94 ··· 191 202 } 192 203 193 204 private suspend fun updateFirstDayOfWeekViewData() { 194 - val data = loadFirstDayOfWeekViewData() 195 - (firstDayOfWeekViewData as MutableLiveData).value = data 205 + firstDayOfWeekViewData.set(loadFirstDayOfWeekViewData()) 196 206 } 197 207 198 208 private suspend fun loadFirstDayOfWeekViewData(): FirstDayOfWeekViewData { 199 209 return prefsInteractor.getFirstDayOfWeek() 200 210 .let(settingsMapper::toFirstDayOfWeekViewData) 211 + } 212 + 213 + private suspend fun updateRepeatButtonViewData() { 214 + repeatButtonViewData.set(loadRepeatButtonViewData()) 215 + } 216 + 217 + private suspend fun loadRepeatButtonViewData(): RepeatButtonViewData { 218 + return prefsInteractor.getRepeatButtonType() 219 + .let(settingsMapper::toRepeatButtonViewData) 201 220 } 202 221 203 222 private suspend fun updateStartOfDayViewData() {