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.

fix code some inspection warnings

razeeman (Nov 20, 2022, 3:45 PM +0300) 759b621a bc81dcf2

+46 -212
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/utils/BaseUiTest.kt
··· 8 8 import androidx.test.espresso.IdlingRegistry 9 9 import androidx.test.ext.junit.rules.ActivityScenarioRule 10 10 import androidx.test.platform.app.InstrumentationRegistry 11 - import com.example.util.simpletimetracker.R 11 + import com.example.util.simpletimetracker.core.R 12 12 import com.example.util.simpletimetracker.core.mapper.ColorMapper 13 13 import com.example.util.simpletimetracker.core.mapper.IconEmojiMapper 14 14 import com.example.util.simpletimetracker.core.mapper.IconImageMapper
+1 -1
app/src/androidTest/java/com/example/util/simpletimetracker/utils/ViewActions.kt
··· 220 220 "scroll RecyclerView to bottom" 221 221 222 222 override fun getConstraints(): Matcher<View> = 223 - allOf<View>(isAssignableFrom(RecyclerView::class.java), isDisplayed()) 223 + allOf(isAssignableFrom(RecyclerView::class.java), isDisplayed()) 224 224 225 225 override fun perform(uiController: UiController?, view: View?) { 226 226 val recyclerView = view as RecyclerView
+1 -1
app/src/debug/res/values/strings.xml
··· 1 1 <resources> 2 - <string name="app_name">Debug Simple Time Tracker</string> 2 + <string name="app_name" translatable="false">Debug Simple Time Tracker</string> 3 3 </resources>
-41
app/src/main/res/anim/fragment_close_exit.xml
··· 1 - <?xml version="1.0" encoding="utf-8"?> 2 - <!-- 3 - Copyright 2019 The Android Open Source Project 4 - 5 - Licensed under the Apache License, Version 2.0 (the "License"); 6 - you may not use this file except in compliance with the License. 7 - You may obtain a copy of the License at 8 - 9 - http://www.apache.org/licenses/LICENSE-2.0 10 - 11 - Unless required by applicable law or agreed to in writing, software 12 - distributed under the License is distributed on an "AS IS" BASIS, 13 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 - See the License for the specific language governing permissions and 15 - limitations under the License. 16 - --> 17 - <set xmlns:android="http://schemas.android.com/apk/res/android" 18 - android:shareInterpolator="false" 19 - android:zAdjustment="top"> 20 - <alpha 21 - android:fromAlpha="1" 22 - android:toAlpha="0.0" 23 - android:fillEnabled="true" 24 - android:fillBefore="true" 25 - android:fillAfter="true" 26 - android:interpolator="@android:anim/linear_interpolator" 27 - android:startOffset="66" 28 - android:duration="50"/> 29 - <scale 30 - android:fromXScale="1" 31 - android:toXScale="0.9" 32 - android:fromYScale="1" 33 - android:toYScale="0.9" 34 - android:pivotX="50%" 35 - android:pivotY="50%" 36 - android:fillEnabled="true" 37 - android:fillBefore="true" 38 - android:fillAfter="true" 39 - android:interpolator="@anim/fragment_fast_out_extra_slow_in" 40 - android:duration="300"/> 41 - </set>
-42
app/src/main/res/anim/fragment_open_enter.xml
··· 1 - <?xml version="1.0" encoding="utf-8"?> 2 - <!-- 3 - Copyright 2019 The Android Open Source Project 4 - 5 - Licensed under the Apache License, Version 2.0 (the "License"); 6 - you may not use this file except in compliance with the License. 7 - You may obtain a copy of the License at 8 - 9 - http://www.apache.org/licenses/LICENSE-2.0 10 - 11 - Unless required by applicable law or agreed to in writing, software 12 - distributed under the License is distributed on an "AS IS" BASIS, 13 - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 - See the License for the specific language governing permissions and 15 - limitations under the License. 16 - --> 17 - <set xmlns:android="http://schemas.android.com/apk/res/android" 18 - xmlns:tools="http://schemas.android.com/tools" 19 - android:shareInterpolator="false"> 20 - <alpha 21 - android:fromAlpha="0" 22 - android:toAlpha="1.0" 23 - android:fillEnabled="true" 24 - android:fillBefore="true" 25 - android:fillAfter="true" 26 - android:interpolator="@android:anim/linear_interpolator" 27 - android:startOffset="35" 28 - android:duration="50"/> 29 - <scale 30 - android:fromXScale="0.85" 31 - android:toXScale="1" 32 - android:fromYScale="0.85" 33 - android:toYScale="1" 34 - android:pivotX="50%" 35 - android:pivotY="50%" 36 - android:fillEnabled="true" 37 - android:fillBefore="true" 38 - android:fillAfter="true" 39 - android:interpolator="@anim/fragment_fast_out_extra_slow_in" 40 - android:duration="300" 41 - tools:targetApi="lollipop" /> 42 - </set>
+1 -1
app/src/main/res/values/strings.xml
··· 1 1 <resources> 2 - <string name="app_name">Simple Time Tracker</string> 2 + <string name="app_name" translatable="false">Simple Time Tracker</string> 3 3 </resources>
+1 -1
core/src/main/java/com/example/util/simpletimetracker/core/base/BaseActivity.kt
··· 8 8 inline fun <T> LiveData<T>.observe( 9 9 crossinline onChanged: (T) -> Unit 10 10 ) { 11 - observe(this@BaseActivity, { onChanged(it) }) 11 + observe(this@BaseActivity) { onChanged(it) } 12 12 } 13 13 }
+1 -1
core/src/main/java/com/example/util/simpletimetracker/core/base/BaseBottomSheetFragment.kt
··· 62 62 inline fun <T> LiveData<T>.observe( 63 63 crossinline onChanged: (T) -> Unit 64 64 ) { 65 - observe(viewLifecycleOwner, { onChanged(it) }) 65 + observe(viewLifecycleOwner) { onChanged(it) } 66 66 } 67 67 }
+1 -1
core/src/main/java/com/example/util/simpletimetracker/core/base/BaseFragment.kt
··· 58 58 inline fun <T> LiveData<T>.observe( 59 59 crossinline onChanged: (T) -> Unit 60 60 ) { 61 - observe(viewLifecycleOwner, { onChanged(it) }) 61 + observe(viewLifecycleOwner) { onChanged(it) } 62 62 } 63 63 }
-5
core/src/main/java/com/example/util/simpletimetracker/core/mapper/CategoryViewDataMapper.kt
··· 96 96 color.let { colorMapper.mapToColorInt(it, isDarkTheme) } 97 97 } 98 98 } 99 - 100 - companion object { 101 - private const val DEFAULT_ICON_TEXT_ALPHA = 1.0f 102 - private const val FILTERED_ICON_TEXT_ALPHA = 0.3f 103 - } 104 99 }
+1 -1
core/src/main/java/com/example/util/simpletimetracker/core/mapper/RangeMapper.kt
··· 73 73 } 74 74 75 75 fun mapToDuration(ranges: List<Range>): Long { 76 - return ranges.map { it.duration }.sum() 76 + return ranges.sumOf { it.duration } 77 77 } 78 78 79 79 private fun mapToRangeName(rangeLength: RangeLength): RangeViewData {
+1 -1
core/src/main/java/com/example/util/simpletimetracker/core/utils/TouchDetectors.kt
··· 94 94 class SwipeDetector( 95 95 context: Context, 96 96 private val onSlideStart: () -> Unit = {}, 97 - onSlide: (offset: Float, initialDirection: Direction, event: MotionEvent) -> Unit = { _, _, _ -> Unit }, 97 + onSlide: (offset: Float, initialDirection: Direction, event: MotionEvent) -> Unit = { _, _, _ -> }, 98 98 private val onSlideStop: () -> Unit = {}, 99 99 ) { 100 100
-8
core/src/main/res/drawable/circle_border.xml
··· 1 - <?xml version="1.0" encoding="utf-8"?> 2 - <shape xmlns:android="http://schemas.android.com/apk/res/android" 3 - android:shape="oval"> 4 - <solid android:color="@color/transparent" /> 5 - <stroke 6 - android:width="8dp" 7 - android:color="@color/black" /> 8 - </shape>
-9
core/src/main/res/drawable/main_icon.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="M22,5.72l-4.6,-3.86 -1.29,1.53 4.6,3.86L22,5.72zM7.88,3.39L6.6,1.86 2,5.71l1.29,1.53 4.59,-3.85zM12,4c-4.97,0 -9,4.03 -9,9s4.02,9 9,9c4.97,0 9,-4.03 9,-9s-4.03,-9 -9,-9zM12,20c-3.87,0 -7,-3.13 -7,-7s3.13,-7 7,-7 7,3.13 7,7 -3.13,7 -7,7zM10.54,14.53L8.41,12.4l-1.06,1.06 3.18,3.18 6,-6 -1.06,-1.06 -4.93,4.95z"/> 9 - </vector>
-8
core/src/main/res/drawable/round_corners_border.xml
··· 1 - <?xml version="1.0" encoding="UTF-8"?> 2 - <shape xmlns:android="http://schemas.android.com/apk/res/android"> 3 - <solid android:color="@color/transparent" /> 4 - <stroke 5 - android:width="1dp" 6 - android:color="@color/black" /> 7 - <corners android:radius="12dp" /> 8 - </shape>
-2
core/src/main/res/values-de/strings.xml
··· 92 92 <string name="change_record_comment_hint">Kommentar</string> 93 93 <string name="change_record_last_comments_hint">Letzte Kommentare</string> 94 94 <string name="change_record_categories_empty">Keine Datensatz-Tags hinzugefügt</string> 95 - <string name="change_record_activity_not_selected">Aktivität nicht ausgewählt</string> 96 95 <string name="change_record_save">Speichern</string> 97 96 <string name="change_record_untagged">Nicht markiert</string> 98 97 <string name="change_running_record_removed">Laufende Aktivität entfernt</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Einträge sortieren</string> 148 - <string name="records_all_filter">Aktivitäten filtern</string> 149 147 <string name="records_all_sort_time_started">Zeit gestartet</string> 150 148 <string name="records_all_sort_duration">Dauer</string> 151 149 <string name="records_all_search_comment">Kommentar suchen</string>
-2
core/src/main/res/values-es/strings.xml
··· 92 92 <string name="change_record_comment_hint">Comentario</string> 93 93 <string name="change_record_last_comments_hint">Últimos comentarios</string> 94 94 <string name="change_record_categories_empty">No se añadieron etiquetas</string> 95 - <string name="change_record_activity_not_selected">No se seleccionó ninguna actividad</string> 96 95 <string name="change_record_save">Guardar</string> 97 96 <string name="change_record_untagged">Sin etiquetar</string> 98 97 <string name="change_running_record_removed">Temporizador eliminado</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Ordenar los registros</string> 148 - <string name="records_all_filter">Filtrar las actividades</string> 149 147 <string name="records_all_sort_time_started">Tiempo de inicio</string> 150 148 <string name="records_all_sort_duration">Duración</string> 151 149 <string name="records_all_search_comment">Buscar comentario</string>
-2
core/src/main/res/values-fr/strings.xml
··· 92 92 <string name="change_record_comment_hint">Commenter</string> 93 93 <string name="change_record_last_comments_hint">Derniers commentaires</string> 94 94 <string name="change_record_categories_empty">Aucune étiquette d\'enregistrement ajoutée</string> 95 - <string name="change_record_activity_not_selected">Activité non sélectionnée</string> 96 95 <string name="change_record_save">Sauvegarder</string> 97 96 <string name="change_record_untagged">Non étiqueté</string> 98 97 <string name="change_running_record_removed">Activité en cours d\'exécution supprimée</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Trier les enregistrements</string> 148 - <string name="records_all_filter">Filtrer les activités</string> 149 147 <string name="records_all_sort_time_started">Heure de début</string> 150 148 <string name="records_all_sort_duration">Durée</string> 151 149 <string name="records_all_search_comment">Rechercher un commentaire</string>
-2
core/src/main/res/values-in/strings.xml
··· 92 92 <string name="change_record_comment_hint">Komentar</string> 93 93 <string name="change_record_last_comments_hint">Komentar terakhir</string> 94 94 <string name="change_record_categories_empty">Tidak ada label rekaman yang ditambahkan</string> 95 - <string name="change_record_activity_not_selected">Kegiatan tidak dipilih</string> 96 95 <string name="change_record_save">Simpan</string> 97 96 <string name="change_record_untagged">Tidak berlabel</string> 98 97 <string name="change_running_record_removed">Kegiatan berjalan dihapus</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Urutkan rekor</string> 148 - <string name="records_all_filter">Saring kegiatan</string> 149 147 <string name="records_all_sort_time_started">Waktu dimulai</string> 150 148 <string name="records_all_sort_duration">Durasi</string> 151 149 <string name="records_all_search_comment">Cari komentar</string>
-2
core/src/main/res/values-it/strings.xml
··· 92 92 <string name="change_record_comment_hint">Commento</string> 93 93 <string name="change_record_last_comments_hint">Ultimi commenti</string> 94 94 <string name="change_record_categories_empty">Nessuna etichetta aggiunta alla registrazione</string> 95 - <string name="change_record_activity_not_selected">Attività non selezionata</string> 96 95 <string name="change_record_save">Salva</string> 97 96 <string name="change_record_untagged">Non etichettato</string> 98 97 <string name="change_running_record_removed">Attività in corso rimossa</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Ordina le registrazioni</string> 148 - <string name="records_all_filter">Filtra le attività</string> 149 147 <string name="records_all_sort_time_started">Ora di inizio</string> 150 148 <string name="records_all_sort_duration">Durata</string> 151 149 <string name="records_all_search_comment">Cerca commento</string>
-2
core/src/main/res/values-ja/strings.xml
··· 92 92 <string name="change_record_comment_hint">コメント</string> 93 93 <string name="change_record_last_comments_hint">最新コメント</string> 94 94 <string name="change_record_categories_empty">計測タグがありません</string> 95 - <string name="change_record_activity_not_selected">アクティビティが選択されていない</string> 96 95 <string name="change_record_save">保存</string> 97 96 <string name="change_record_untagged">タグを外す</string> 98 97 <string name="change_running_record_removed">記録中のアクティビティを削除</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">計測記録をソート</string> 148 - <string name="records_all_filter">アクティビティをフィルタ</string> 149 147 <string name="records_all_sort_time_started">時間の開始</string> 150 148 <string name="records_all_sort_duration">期間</string> 151 149 <string name="records_all_search_comment">検索コメント</string>
-2
core/src/main/res/values-nl/strings.xml
··· 92 92 <string name="change_record_comment_hint">Opmerking</string> 93 93 <string name="change_record_last_comments_hint">Laatste opmerkingen</string> 94 94 <string name="change_record_categories_empty">Geen opname labels toegevoegd</string> 95 - <string name="change_record_activity_not_selected">Activiteit niet geselecteerd</string> 96 95 <string name="change_record_save">Opslaan</string> 97 96 <string name="change_record_untagged">Niet gelabeld</string> 98 97 <string name="change_running_record_removed">Lopende activiteit verwijderd</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Records sorteren</string> 148 - <string name="records_all_filter">Activiteiten filteren</string> 149 147 <string name="records_all_sort_time_started">Tijd begonnen</string> 150 148 <string name="records_all_sort_duration">Looptijd</string> 151 149 <string name="records_all_search_comment">Opmerking zoeken</string>
-2
core/src/main/res/values-pt/strings.xml
··· 92 92 <string name="change_record_comment_hint">Comentário</string> 93 93 <string name="change_record_last_comments_hint">Últimos comentários</string> 94 94 <string name="change_record_categories_empty">Nenhuma tag de registro adicionada</string> 95 - <string name="change_record_activity_not_selected">Atividade não selecionada</string> 96 95 <string name="change_record_save">Salvar</string> 97 96 <string name="change_record_untagged">Sem tag</string> 98 97 <string name="change_running_record_removed">Atividade em andamento removida</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Ordenar registros</string> 148 - <string name="records_all_filter">Filtrar atividades</string> 149 147 <string name="records_all_sort_time_started">Hora de início</string> 150 148 <string name="records_all_sort_duration">Duração</string> 151 149 <string name="records_all_search_comment">Pesquisar comentário</string>
-2
core/src/main/res/values-ru/strings.xml
··· 92 92 <string name="change_record_comment_hint">Комментарий</string> 93 93 <string name="change_record_last_comments_hint">Последние комментарии</string> 94 94 <string name="change_record_categories_empty">Теги для записей не добавлены</string> 95 - <string name="change_record_activity_not_selected">Активность не выбрана</string> 96 95 <string name="change_record_save">Сохранить</string> 97 96 <string name="change_record_untagged">Без тега</string> 98 97 <string name="change_running_record_removed">Текущая активность удалена</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Сортировка</string> 148 - <string name="records_all_filter">Отфильтровать активности</string> 149 147 <string name="records_all_sort_time_started">Дата</string> 150 148 <string name="records_all_sort_duration">Продолж.</string> 151 149 <string name="records_all_search_comment">Поиск комментария</string>
-2
core/src/main/res/values-sv/strings.xml
··· 92 92 <string name="change_record_comment_hint">Kommentar</string> 93 93 <string name="change_record_last_comments_hint">Senaste kommentarer</string> 94 94 <string name="change_record_categories_empty">Ingen händelsetagg vald</string> 95 - <string name="change_record_activity_not_selected">Aktivitet ej vald</string> 96 95 <string name="change_record_save">Spara</string> 97 96 <string name="change_record_untagged">Ej taggad</string> 98 97 <string name="change_running_record_removed">Pågående aktivitet borttagen</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Sortera händelser</string> 148 - <string name="records_all_filter">Filtrera aktiviteter</string> 149 147 <string name="records_all_sort_time_started">Starttid</string> 150 148 <string name="records_all_sort_duration">Varaktighet</string> 151 149 <string name="records_all_search_comment">Sök kommentar</string>
-2
core/src/main/res/values-tr/strings.xml
··· 92 92 <string name="change_record_comment_hint">Yorum</string> 93 93 <string name="change_record_last_comments_hint">Son yorumlar</string> 94 94 <string name="change_record_categories_empty">Kayıt etiketi eklenmedi</string> 95 - <string name="change_record_activity_not_selected">Aktivite seçilmedi</string> 96 95 <string name="change_record_save">Kaydet</string> 97 96 <string name="change_record_untagged">Etiketsiz</string> 98 97 <string name="change_running_record_removed">Takip edilen aktivite silindi</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Kayıtları sırala</string> 148 - <string name="records_all_filter">Kayıtları filtrele</string> 149 147 <string name="records_all_sort_time_started">Başlangıç zamanı</string> 150 148 <string name="records_all_sort_duration">Süre</string> 151 149 <string name="records_all_search_comment">Yorum ara</string>
-2
core/src/main/res/values-uk/strings.xml
··· 92 92 <string name="change_record_comment_hint">Коментар</string> 93 93 <string name="change_record_last_comments_hint">Останні коментарі</string> 94 94 <string name="change_record_categories_empty">Теги для активності не додані</string> 95 - <string name="change_record_activity_not_selected">Активність не обрана</string> 96 95 <string name="change_record_save">Зберегти</string> 97 96 <string name="change_record_untagged">Без тегу</string> 98 97 <string name="change_running_record_removed">Поточне заняття видалено</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Сортувати записи</string> 148 - <string name="records_all_filter">Фільтрувати заняття</string> 149 147 <string name="records_all_sort_time_started">Початок</string> 150 148 <string name="records_all_sort_duration">Тривалість</string> 151 149 <string name="records_all_search_comment">Шукати коментар</string>
-2
core/src/main/res/values-zh/strings.xml
··· 92 92 <string name="change_record_comment_hint">备注</string> 93 93 <string name="change_record_last_comments_hint">最后评论</string> 94 94 <string name="change_record_categories_empty">未添加记录标签</string> 95 - <string name="change_record_activity_not_selected">未选择活动</string> 96 95 <string name="change_record_save">保存</string> 97 96 <string name="change_record_untagged">无标签</string> 98 97 <string name="change_running_record_removed">正在追踪的活动已删除</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">对记录排序</string> 148 - <string name="records_all_filter">筛选活动</string> 149 147 <string name="records_all_sort_time_started">开始时间</string> 150 148 <string name="records_all_sort_duration">持续时间</string> 151 149 <string name="records_all_search_comment">搜索评论</string>
-2
core/src/main/res/values/strings.xml
··· 92 92 <string name="change_record_comment_hint">Comment</string> 93 93 <string name="change_record_last_comments_hint">Last comments</string> 94 94 <string name="change_record_categories_empty">No record tags added</string> 95 - <string name="change_record_activity_not_selected">Activity not selected</string> 96 95 <string name="change_record_save">Save</string> 97 96 <string name="change_record_untagged">Untagged</string> 98 97 <string name="change_running_record_removed">Running activity removed</string> ··· 145 144 146 145 <!-- Records all --> 147 146 <string name="records_all_sort_order">Sort records</string> 148 - <string name="records_all_filter">Filter activities</string> 149 147 <string name="records_all_sort_time_started">Time started</string> 150 148 <string name="records_all_sort_duration">Duration</string> 151 149 <string name="records_all_search_comment">Search comment</string>
+1 -1
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/RecordTypeInteractor.kt
··· 116 116 private suspend fun sortByManualOrder(records: List<RecordType>): List<RecordType> { 117 117 val order = prefsInteractor.getCardOrderManual() 118 118 return records 119 - .map { type -> type to order.getOrElse(type.id, { 0 }) } 119 + .map { type -> type to order.getOrElse(type.id) { 0 } } 120 120 .sortedBy { (_, order) -> order } 121 121 .map { (type, _) -> type } 122 122 }
+3 -7
domain/src/main/java/com/example/util/simpletimetracker/domain/mapper/StatisticsMapper.kt
··· 9 9 class StatisticsMapper @Inject constructor() { 10 10 11 11 fun mapToDuration(records: List<Record>): Long { 12 - return records 13 - .map { it.timeEnded - it.timeStarted } 14 - .sum() 12 + return records.sumOf { it.timeEnded - it.timeStarted } 15 13 } 16 14 17 15 fun mapToDurationFromRange(records: List<Record>, start: Long, end: Long): Long { 18 - return records 19 - // Remove parts of the record that is not in the range 20 - .map { min(it.timeEnded, end) - max(it.timeStarted, start) } 21 - .sum() 16 + // Remove parts of the record that is not in the range 17 + return records.sumOf { min(it.timeEnded, end) - max(it.timeStarted, start) } 22 18 } 23 19 24 20 fun getDurationPercentString(
+3 -3
features/feature_change_activity_filter/src/main/java/com/example/util/simpletimetracker/feature_change_activity_filter/interactor/ChangeActivityFilterViewDataInteractor.kt
··· 52 52 } 53 53 } 54 54 .takeUnless { it.isEmpty() } 55 - ?.let { 56 - val selected = it.filter { it.first in selectedIds }.map { it.second } 57 - val available = it.filter { it.first !in selectedIds }.map { it.second } 55 + ?.let { data -> 56 + val selected = data.filter { it.first in selectedIds }.map { it.second } 57 + val available = data.filter { it.first !in selectedIds }.map { it.second } 58 58 selected to available 59 59 } 60 60 ?.let { (selected, available) ->
+9 -7
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/view/ChangeRecordTypeFragment.kt
··· 189 189 updateIconContainerScroll(it) 190 190 viewModel.onIconTypeClick(it) 191 191 } 192 - rvChangeRecordTypeIcon.addOnScrollListenerAdapter(onScrolled = { _, _, _ -> 193 - iconsLayoutManager?.let { 194 - viewModel.onIconsScrolled( 195 - firstVisiblePosition = it.findFirstCompletelyVisibleItemPosition(), 196 - lastVisiblePosition = it.findLastCompletelyVisibleItemPosition(), 197 - ) 192 + rvChangeRecordTypeIcon.addOnScrollListenerAdapter( 193 + onScrolled = { _, _, _ -> 194 + iconsLayoutManager?.let { 195 + viewModel.onIconsScrolled( 196 + firstVisiblePosition = it.findFirstCompletelyVisibleItemPosition(), 197 + lastVisiblePosition = it.findLastCompletelyVisibleItemPosition(), 198 + ) 199 + } 198 200 } 199 - }) 201 + ) 200 202 } 201 203 202 204 override fun initViewModel(): Unit = with(binding) {
+1 -1
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewData/ChangeRecordTypeChooserState.kt
··· 1 1 package com.example.util.simpletimetracker.feature_change_record_type.viewData 2 2 3 3 sealed interface ChangeRecordTypeChooserState { 4 - object Closed: ChangeRecordTypeChooserState 4 + object Closed : ChangeRecordTypeChooserState 5 5 object Color : ChangeRecordTypeChooserState 6 6 object Icon : ChangeRecordTypeChooserState 7 7 object Category : ChangeRecordTypeChooserState
+1 -1
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt
··· 243 243 } 244 244 245 245 infoItems 246 - .lastOrNull() { items.indexOf(it) <= firstVisiblePosition } 246 + .lastOrNull { items.indexOf(it) <= firstVisiblePosition } 247 247 ?.let { updateIconCategories(it.getUniqueId()) } 248 248 } 249 249
-4
features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/duration/view/DurationDialogFragment.kt
··· 58 58 setFullScreen() 59 59 } 60 60 61 - override fun initUi() { 62 - // Do nothing 63 - } 64 - 65 61 override fun initUx(): Unit = with(binding) { 66 62 btnDurationPickerSave.setOnClick(::onSaveClick) 67 63 btnDurationPickerDisable.setOnClick(::onDisableClick)
-4
features/feature_dialogs/src/main/java/com/example/util/simpletimetracker/feature_dialogs/emojiSelection/view/EmojiSelectionDialogFragment.kt
··· 80 80 } 81 81 } 82 82 83 - override fun initUx() { 84 - // Do nothing 85 - } 86 - 87 83 override fun initViewModel(): Unit = with(viewModel) { 88 84 extra = params 89 85 icons.observe(adapter::replace)
-1
features/feature_dialogs/src/main/res/layout/card_size_dialog_fragment.xml
··· 1 1 <?xml version="1.0" encoding="utf-8"?> 2 2 <androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" 3 - xmlns:app="http://schemas.android.com/apk/res-auto" 4 3 xmlns:tools="http://schemas.android.com/tools" 5 4 android:layout_width="match_parent" 6 5 android:layout_height="match_parent"
+1 -1
features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/goalTime/controller/NotificationGoalTimeBroadcastController.kt
··· 12 12 } 13 13 14 14 fun onBootCompleted() { 15 - // reschedule inactivity reminder 15 + // TODO reschedule goal time reminder 16 16 } 17 17 }
+1 -1
features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/inactivity/controller/NotificationInactivityBroadcastController.kt
··· 12 12 } 13 13 14 14 fun onBootCompleted() { 15 - // reschedule inactivity reminder 15 + // TODO reschedule inactivity reminder 16 16 } 17 17 }
+1 -1
features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/interactor/NotificationTypeInteractorImpl.kt
··· 63 63 } 64 64 65 65 private suspend fun showAll() { 66 - val recordTypes = recordTypeInteractor.getAll().map { it.id to it }.toMap() 66 + val recordTypes = recordTypeInteractor.getAll().associateBy { it.id } 67 67 val recordTags = recordTagInteractor.getAll() 68 68 val isDarkTheme = prefsInteractor.getDarkMode() 69 69 val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat()
+1 -1
features/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/interactor/RecordsViewDataInteractor.kt
··· 36 36 val startOfDayShift = prefsInteractor.getStartOfDayShift() 37 37 val isCalendarView = prefsInteractor.getShowRecordsCalendar() 38 38 val showUntrackedInRecords = prefsInteractor.getShowUntrackedInRecords() 39 - val recordTypes = recordTypeInteractor.getAll().map { it.id to it }.toMap() 39 + val recordTypes = recordTypeInteractor.getAll().associateBy { it.id } 40 40 val recordTags = recordTagInteractor.getAll() 41 41 val (rangeStart, rangeEnd) = timeMapper.getRangeStartAndEnd( 42 42 rangeLength = RangeLength.Day,
+1
features/feature_records/src/main/res/layout/records_container_fragment.xml
··· 21 21 android:id="@+id/btnRecordAdd" 22 22 android:layout_width="wrap_content" 23 23 android:layout_height="wrap_content" 24 + android:contentDescription="Add record" 24 25 android:src="@drawable/add" 25 26 app:backgroundTint="?appInactiveColor" 26 27 app:fabSize="normal"
+1 -1
features/feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/interactor/RecordsAllViewDataInteractor.kt
··· 39 39 val isDarkTheme = prefsInteractor.getDarkMode() 40 40 val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 41 41 val useProportionalMinutes = prefsInteractor.getUseProportionalMinutes() 42 - val recordTypes = recordTypeInteractor.getAll().map { it.id to it }.toMap() 42 + val recordTypes = recordTypeInteractor.getAll().associateBy { it.id } 43 43 val recordTags = recordTagInteractor.getAll() 44 44 val typesSelected = typesFilterInteractor.getTypeIds(filter) 45 45 val records = if (commentSearch.isEmpty()) {
+1 -1
features/feature_settings/src/main/res/layout/settings_additional_layout.xml
··· 237 237 android:layout_width="match_parent" 238 238 android:layout_height="match_parent" 239 239 android:visibility="gone" 240 - app:constraint_referenced_ids="tvSettingsRecordTagSelectionCloseHint, @+id/checkboxSettingsRecordTagSelectionClose" 240 + app:constraint_referenced_ids="tvSettingsRecordTagSelectionCloseHint, checkboxSettingsRecordTagSelectionClose" 241 241 tools:visibility="visible" /> 242 242 243 243 </androidx.constraintlayout.widget.ConstraintLayout>
+1 -1
features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/customView/BarChartView.kt
··· 133 133 134 134 fun setBars(data: List<ViewData>) { 135 135 bars = data.takeUnless { it.isEmpty() } ?: listOf(ViewData(0f, "", "")) 136 - maxValue = data.map(ViewData::value).maxOrNull() ?: 1f 136 + maxValue = data.maxOfOrNull(ViewData::value) ?: 1f 137 137 selectedBar = -1 138 138 invalidate() 139 139 if (!isInEditMode) animateBars()
+4 -4
features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/interactor/StatisticsDetailStatsInteractor.kt
··· 135 135 ) 136 136 val tagSplitData = mapTags( 137 137 records = records, 138 - typesMap = types.map { it.id to it }.toMap(), 139 - tagsMap = tags.map { it.id to it }.toMap(), 138 + typesMap = types.associateBy { it.id }, 139 + tagsMap = tags.associateBy { it.id }, 140 140 isDarkTheme = isDarkTheme, 141 141 useProportionalMinutes = useProportionalMinutes 142 142 ) ··· 289 289 290 290 records.forEach { record -> 291 291 record.tagIds.forEach { tagId -> 292 - tags.getOrPut(tagId, { mutableListOf() }).add(record) 292 + tags.getOrPut(tagId) { mutableListOf() }.add(record) 293 293 } 294 294 if (record.tagIds.isEmpty()) { 295 - tags.getOrPut(0, { mutableListOf() }).add(record) 295 + tags.getOrPut(0) { mutableListOf() }.add(record) 296 296 } 297 297 } 298 298
+3 -3
features/feature_statistics_detail/src/main/java/com/example/util/simpletimetracker/feature_statistics_detail/mapper/StatisticsDetailViewDataMapper.kt
··· 269 269 270 270 fun getAverage(data: List<ChartBarDataDuration>): Long? { 271 271 if (data.isEmpty()) return null 272 - return data.map { it.duration }.sum() / data.size 272 + return data.sumOf { it.duration } / data.size 273 273 } 274 274 275 275 val average = getAverage(data) ··· 319 319 data: List<ChartBarDataDuration>, 320 320 rangeLength: RangeLength, 321 321 ): StatisticsDetailChartViewData { 322 - val isMinutes = data.map(ChartBarDataDuration::duration) 323 - .maxOrNull().orZero() 322 + val isMinutes = data.maxOfOrNull(ChartBarDataDuration::duration) 323 + .orZero() 324 324 .let(TimeUnit.MILLISECONDS::toHours) == 0L 325 325 326 326 val legendSuffix = if (isMinutes) {
-9
features/feature_statistics_detail/src/main/res/drawable/statistics_detail_more.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="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> 9 - </vector>
+2 -2
features/feature_views/src/main/java/com/example/util/simpletimetracker/feature_views/extension/ViewExtensions.kt
··· 158 158 } 159 159 160 160 fun RecyclerView.addOnScrollListenerAdapter( 161 - onScrolled: (recyclerView: RecyclerView, dx: Int, dy: Int) -> Unit = { _, _, _ -> Unit }, 162 - onScrollStateChanged: (recyclerView: RecyclerView, newState: Int) -> Unit = { _, _ -> Unit } 161 + onScrolled: (recyclerView: RecyclerView, dx: Int, dy: Int) -> Unit = { _, _, _ -> }, 162 + onScrollStateChanged: (recyclerView: RecyclerView, newState: Int) -> Unit = { _, _ -> } 163 163 ) = object : RecyclerView.OnScrollListener() { 164 164 override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { 165 165 onScrolled(recyclerView, dx, dy)
-4
features/feature_views/src/main/res/values/styles.xml
··· 201 201 <item name="cardElevation">@dimen/record_type_card_elevation</item> 202 202 </style> 203 203 204 - <style name="RecordTypeIcon"> 205 - <item name="backgroundTint">?appIconColor</item> 206 - </style> 207 - 208 204 <style name="RecordTypeText"> 209 205 <item name="android:maxLines">2</item> 210 206 <item name="android:textColor">?appIconColor</item>
+1 -1
features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/WidgetUniversalProvider.kt
··· 70 70 context: Context 71 71 ): View = runBlocking { 72 72 val runningRecords = runningRecordInteractor.getAll() 73 - val recordTypes = recordTypeInteractor.getAll().map { it.id to it }.toMap() 73 + val recordTypes = recordTypeInteractor.getAll().associateBy { it.id } 74 74 val isDarkTheme = prefsInteractor.getDarkMode() 75 75 76 76 val data = runningRecords
-1
features/feature_widget/src/main/res/layout/widget_layout.xml
··· 1 1 <?xml version="1.0" encoding="utf-8"?> 2 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 - xmlns:app="http://schemas.android.com/apk/res-auto" 4 3 xmlns:tools="http://schemas.android.com/tools" 5 4 android:layout_width="match_parent" 6 5 android:layout_height="match_parent">
+1 -2
navigation/src/main/AndroidManifest.xml
··· 1 - <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 - package="com.example.util.simpletimetracker.navigation" /> 1 + <manifest package="com.example.util.simpletimetracker.navigation" />