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.

change main settings block to recycler

razeeman (Jan 8, 2024, 7:54 PM +0300) 924f8f3a 5f7ae154

+706 -283
+12
features/feature_settings/src/main/res/layout/item_settings_bottom.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 + android:layout_width="match_parent" 4 + android:layout_height="@dimen/settings_background_height"> 5 + 6 + <com.google.android.material.card.MaterialCardView 7 + style="@style/SettingsCard" 8 + android:layout_width="match_parent" 9 + android:layout_height="@dimen/settings_background_height_double" 10 + android:translationY="@dimen/settings_background_bottom_shift" /> 11 + 12 + </FrameLayout>
+68
features/feature_settings/src/main/res/layout/item_settings_checkbox.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 + xmlns:app="http://schemas.android.com/apk/res-auto" 4 + xmlns:tools="http://schemas.android.com/tools" 5 + android:layout_width="match_parent" 6 + android:layout_height="wrap_content"> 7 + 8 + <com.google.android.material.card.MaterialCardView 9 + style="@style/SettingsCard" 10 + android:layout_width="match_parent" 11 + android:layout_height="0dp" 12 + android:scaleY="2.5" 13 + app:layout_constraintBottom_toBottomOf="parent" 14 + app:layout_constraintTop_toTopOf="parent" /> 15 + 16 + <androidx.appcompat.widget.AppCompatTextView 17 + android:id="@+id/tvItemSettingsTitle" 18 + style="@style/SettingsText" 19 + android:layout_width="0dp" 20 + android:layout_height="wrap_content" 21 + android:layout_marginStart="4dp" 22 + android:layout_marginTop="12dp" 23 + android:paddingTop="0dp" 24 + android:paddingBottom="0dp" 25 + android:translationZ="4dp" 26 + app:layout_constraintBottom_toTopOf="@id/tvItemSettingsSubtitle" 27 + app:layout_constraintEnd_toStartOf="@id/checkboxItemSettings" 28 + app:layout_constraintStart_toStartOf="parent" 29 + app:layout_constraintTop_toTopOf="parent" 30 + app:layout_goneMarginEnd="4dp" 31 + tools:text="Title" /> 32 + 33 + <androidx.appcompat.widget.AppCompatTextView 34 + android:id="@+id/tvItemSettingsSubtitle" 35 + style="@style/SettingsSecondaryText" 36 + android:layout_width="0dp" 37 + android:layout_height="wrap_content" 38 + android:layout_marginStart="4dp" 39 + android:paddingBottom="0dp" 40 + android:translationZ="4dp" 41 + android:visibility="gone" 42 + app:layout_constraintEnd_toStartOf="@id/checkboxItemSettings" 43 + app:layout_constraintStart_toStartOf="parent" 44 + app:layout_constraintTop_toBottomOf="@id/tvItemSettingsTitle" 45 + app:layout_goneMarginEnd="4dp" 46 + tools:text="Subtitle" 47 + tools:visibility="visible" /> 48 + 49 + <androidx.appcompat.widget.AppCompatCheckBox 50 + android:id="@+id/checkboxItemSettings" 51 + android:layout_width="wrap_content" 52 + android:layout_height="0dp" 53 + android:layout_marginEnd="4dp" 54 + android:translationZ="4dp" 55 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsTitle" 56 + app:layout_constraintEnd_toEndOf="parent" 57 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsTitle" /> 58 + 59 + <View 60 + android:id="@+id/viewItemSettingsDivider" 61 + style="@style/SettingsDivider" 62 + android:layout_width="match_parent" 63 + android:layout_marginHorizontal="12dp" 64 + android:layout_marginTop="12dp" 65 + android:translationZ="4dp" 66 + app:layout_constraintTop_toBottomOf="@id/tvItemSettingsSubtitle" /> 67 + 68 + </androidx.constraintlayout.widget.ConstraintLayout>
+62
features/feature_settings/src/main/res/layout/item_settings_spinner.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 + xmlns:app="http://schemas.android.com/apk/res-auto" 4 + xmlns:tools="http://schemas.android.com/tools" 5 + android:layout_width="match_parent" 6 + android:layout_height="wrap_content"> 7 + 8 + <com.google.android.material.card.MaterialCardView 9 + style="@style/SettingsCard" 10 + android:layout_width="match_parent" 11 + android:layout_height="0dp" 12 + android:scaleY="2.5" 13 + app:layout_constraintBottom_toBottomOf="parent" 14 + app:layout_constraintTop_toTopOf="parent" /> 15 + 16 + <androidx.appcompat.widget.AppCompatTextView 17 + android:id="@+id/tvItemSettingsTitle" 18 + style="@style/SettingsText" 19 + android:layout_width="0dp" 20 + android:layout_height="wrap_content" 21 + android:layout_marginStart="4dp" 22 + android:translationZ="4dp" 23 + app:layout_constraintEnd_toEndOf="parent" 24 + app:layout_constraintEnd_toStartOf="@id/tvItemSettingsValue" 25 + app:layout_constraintStart_toStartOf="parent" 26 + app:layout_constraintTop_toTopOf="parent" 27 + tools:text="Title" /> 28 + 29 + <androidx.appcompat.widget.AppCompatTextView 30 + android:id="@+id/tvItemSettingsValue" 31 + android:layout_width="wrap_content" 32 + android:layout_height="0dp" 33 + android:layout_marginEnd="32dp" 34 + android:gravity="end|center_vertical" 35 + android:paddingStart="8dp" 36 + android:paddingEnd="8dp" 37 + android:textColor="?appTextPrimaryColor" 38 + android:translationZ="4dp" 39 + app:layout_constraintBottom_toBottomOf="@id/spinnerItemSettings" 40 + app:layout_constraintEnd_toEndOf="@id/spinnerItemSettings" 41 + app:layout_constraintTop_toTopOf="@id/spinnerItemSettings" 42 + tools:text="@string/settings_dark_mode_system" /> 43 + 44 + <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 45 + android:id="@+id/spinnerItemSettings" 46 + android:layout_width="wrap_content" 47 + android:layout_height="0dp" 48 + android:layout_marginEnd="12dp" 49 + android:translationZ="4dp" 50 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsTitle" 51 + app:layout_constraintEnd_toEndOf="parent" 52 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsTitle" /> 53 + 54 + <View 55 + android:id="@+id/viewItemSettingsDivider" 56 + style="@style/SettingsDivider" 57 + android:layout_width="match_parent" 58 + android:layout_marginHorizontal="12dp" 59 + android:translationZ="4dp" 60 + app:layout_constraintTop_toBottomOf="@id/tvItemSettingsTitle" /> 61 + 62 + </androidx.constraintlayout.widget.ConstraintLayout>
+63
features/feature_settings/src/main/res/layout/item_settings_spinner_not_checkable.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 + xmlns:app="http://schemas.android.com/apk/res-auto" 4 + xmlns:tools="http://schemas.android.com/tools" 5 + android:layout_width="match_parent" 6 + android:layout_height="wrap_content"> 7 + 8 + <com.google.android.material.card.MaterialCardView 9 + style="@style/SettingsCard" 10 + android:layout_width="match_parent" 11 + android:layout_height="0dp" 12 + android:scaleY="2.5" 13 + app:layout_constraintBottom_toBottomOf="parent" 14 + app:layout_constraintTop_toTopOf="parent" /> 15 + 16 + <androidx.appcompat.widget.AppCompatTextView 17 + android:id="@+id/tvItemSettingsTitle" 18 + style="@style/SettingsText" 19 + android:layout_width="0dp" 20 + android:layout_height="wrap_content" 21 + android:layout_marginStart="4dp" 22 + android:translationZ="4dp" 23 + app:layout_constraintEnd_toEndOf="parent" 24 + app:layout_constraintEnd_toStartOf="@id/tvItemSettingsValue" 25 + app:layout_constraintStart_toStartOf="parent" 26 + app:layout_constraintTop_toTopOf="parent" 27 + tools:text="Title" /> 28 + 29 + <androidx.appcompat.widget.AppCompatTextView 30 + android:id="@+id/tvItemSettingsValue" 31 + android:layout_width="wrap_content" 32 + android:layout_height="0dp" 33 + android:layout_marginEnd="32dp" 34 + android:gravity="end|center_vertical" 35 + android:paddingStart="8dp" 36 + android:paddingEnd="8dp" 37 + android:textColor="?appTextPrimaryColor" 38 + android:translationZ="4dp" 39 + app:layout_constraintBottom_toBottomOf="@id/spinnerItemSettings" 40 + app:layout_constraintEnd_toEndOf="@id/spinnerItemSettings" 41 + app:layout_constraintTop_toTopOf="@id/spinnerItemSettings" 42 + tools:text="@string/settings_dark_mode_system" /> 43 + 44 + <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 45 + android:id="@+id/spinnerItemSettings" 46 + android:layout_width="wrap_content" 47 + android:layout_height="0dp" 48 + android:layout_marginEnd="12dp" 49 + android:translationZ="4dp" 50 + app:customSpinnerCheckable="false" 51 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsTitle" 52 + app:layout_constraintEnd_toEndOf="parent" 53 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsTitle" /> 54 + 55 + <View 56 + android:id="@+id/viewItemSettingsDivider" 57 + style="@style/SettingsDivider" 58 + android:layout_width="match_parent" 59 + android:layout_marginHorizontal="12dp" 60 + android:translationZ="4dp" 61 + app:layout_constraintBottom_toBottomOf="parent" /> 62 + 63 + </androidx.constraintlayout.widget.ConstraintLayout>
+55
features/feature_settings/src/main/res/layout/item_settings_text.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 + xmlns:app="http://schemas.android.com/apk/res-auto" 4 + xmlns:tools="http://schemas.android.com/tools" 5 + android:layout_width="match_parent" 6 + android:layout_height="wrap_content"> 7 + 8 + <com.google.android.material.card.MaterialCardView 9 + style="@style/SettingsCard" 10 + android:layout_width="match_parent" 11 + android:layout_height="0dp" 12 + android:scaleY="2.5" 13 + app:layout_constraintBottom_toBottomOf="parent" 14 + app:layout_constraintTop_toTopOf="parent" /> 15 + 16 + <LinearLayout 17 + android:id="@+id/layoutItemSettingsText" 18 + android:layout_width="match_parent" 19 + android:layout_height="wrap_content" 20 + android:layout_marginHorizontal="4dp" 21 + android:background="?selectableItemBackground" 22 + android:clickable="true" 23 + android:focusable="true" 24 + android:orientation="vertical" 25 + android:translationZ="4dp" 26 + app:layout_constraintTop_toTopOf="parent"> 27 + 28 + <androidx.appcompat.widget.AppCompatTextView 29 + android:id="@+id/tvItemSettingsTitle" 30 + style="@style/SettingsText" 31 + android:layout_width="match_parent" 32 + android:layout_height="wrap_content" 33 + android:paddingBottom="0dp" 34 + tools:text="Title" /> 35 + 36 + <androidx.appcompat.widget.AppCompatTextView 37 + android:id="@+id/tvItemSettingsSubtitle" 38 + style="@style/SettingsSecondaryText" 39 + android:layout_width="match_parent" 40 + android:layout_height="wrap_content" 41 + android:visibility="gone" 42 + tools:text="Subtitle" 43 + tools:visibility="visible" /> 44 + 45 + </LinearLayout> 46 + 47 + <View 48 + android:id="@+id/viewItemSettingsDivider" 49 + style="@style/SettingsDivider" 50 + android:layout_width="match_parent" 51 + android:layout_marginHorizontal="12dp" 52 + android:translationZ="4dp" 53 + app:layout_constraintTop_toBottomOf="@id/layoutItemSettingsText" /> 54 + 55 + </androidx.constraintlayout.widget.ConstraintLayout>
+11
features/feature_settings/src/main/res/layout/item_settings_top.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 + android:layout_width="match_parent" 4 + android:layout_height="@dimen/settings_background_height"> 5 + 6 + <com.google.android.material.card.MaterialCardView 7 + style="@style/SettingsCard" 8 + android:layout_width="match_parent" 9 + android:layout_height="@dimen/settings_background_height_double" /> 10 + 11 + </FrameLayout>
+11 -4
features/feature_settings/src/main/res/layout/settings_fragment.xml
··· 1 1 <?xml version="1.0" encoding="utf-8"?> 2 2 <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" 3 + xmlns:app="http://schemas.android.com/apk/res-auto" 4 + xmlns:tools="http://schemas.android.com/tools" 3 5 android:id="@+id/containerSettings" 4 6 android:layout_width="match_parent" 5 7 android:layout_height="match_parent"> ··· 11 13 android:paddingStart="8dp" 12 14 android:paddingEnd="8dp"> 13 15 14 - <include 15 - android:id="@+id/layoutSettingsMain" 16 - layout="@layout/settings_main_layout" /> 16 + <androidx.recyclerview.widget.RecyclerView 17 + android:id="@+id/rvSettingsContent" 18 + android:layout_width="match_parent" 19 + android:layout_height="wrap_content" 20 + android:orientation="vertical" 21 + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" 22 + tools:itemCount="3" 23 + tools:listitem="@layout/item_settings_text" /> 17 24 18 25 <include 19 26 android:id="@+id/layoutSettingsRating" ··· 21 28 22 29 <include 23 30 android:id="@+id/layoutSettingsNotifications" 24 - layout="@layout/settings_notifications_layout"/> 31 + layout="@layout/settings_notifications_layout" /> 25 32 26 33 <include 27 34 android:id="@+id/layoutSettingsDisplay"
-197
features/feature_settings/src/main/res/layout/settings_main_layout.xml
··· 1 - <?xml version="1.0" encoding="utf-8"?> 2 - <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 3 - xmlns:app="http://schemas.android.com/apk/res-auto" 4 - xmlns:tools="http://schemas.android.com/tools" 5 - style="@style/SettingsCard" 6 - android:layout_width="match_parent" 7 - android:layout_height="wrap_content"> 8 - 9 - <LinearLayout 10 - android:layout_width="match_parent" 11 - android:layout_height="wrap_content" 12 - android:orientation="vertical" 13 - android:paddingTop="8dp" 14 - android:paddingBottom="8dp"> 15 - 16 - <androidx.constraintlayout.widget.ConstraintLayout 17 - android:layout_width="match_parent" 18 - android:layout_height="wrap_content" 19 - android:paddingTop="12dp"> 20 - 21 - <androidx.appcompat.widget.AppCompatTextView 22 - android:id="@+id/tvSettingsAllowMultitasking" 23 - style="@style/SettingsText" 24 - android:layout_width="0dp" 25 - android:layout_height="wrap_content" 26 - android:paddingTop="0dp" 27 - android:paddingBottom="0dp" 28 - android:text="@string/settings_allow_multitasking" 29 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsAllowMultitasking" 30 - app:layout_constraintStart_toStartOf="parent" 31 - app:layout_constraintTop_toTopOf="parent" /> 32 - 33 - <androidx.appcompat.widget.AppCompatTextView 34 - style="@style/SettingsSecondaryText" 35 - android:layout_width="0dp" 36 - android:layout_height="wrap_content" 37 - android:text="@string/settings_allow_multitasking_hint" 38 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsAllowMultitasking" 39 - app:layout_constraintStart_toStartOf="parent" 40 - app:layout_constraintTop_toBottomOf="@id/tvSettingsAllowMultitasking" /> 41 - 42 - <androidx.appcompat.widget.AppCompatCheckBox 43 - android:id="@+id/checkboxSettingsAllowMultitasking" 44 - android:layout_width="wrap_content" 45 - android:layout_height="0dp" 46 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsAllowMultitasking" 47 - app:layout_constraintEnd_toEndOf="parent" 48 - app:layout_constraintTop_toTopOf="@id/tvSettingsAllowMultitasking" /> 49 - 50 - </androidx.constraintlayout.widget.ConstraintLayout> 51 - 52 - <View 53 - style="@style/SettingsDivider" 54 - android:layout_width="match_parent" /> 55 - 56 - <androidx.constraintlayout.widget.ConstraintLayout 57 - android:layout_width="match_parent" 58 - android:layout_height="wrap_content"> 59 - 60 - <androidx.appcompat.widget.AppCompatTextView 61 - android:id="@+id/tvSettingsDarkMode" 62 - style="@style/SettingsText" 63 - android:layout_width="0dp" 64 - android:layout_height="wrap_content" 65 - android:text="@string/settings_dark_mode" 66 - app:layout_constraintEnd_toStartOf="@id/tvSettingsDarkModeValue" 67 - app:layout_constraintStart_toStartOf="parent" 68 - app:layout_constraintTop_toTopOf="parent" /> 69 - 70 - <androidx.appcompat.widget.AppCompatTextView 71 - android:id="@+id/tvSettingsDarkModeValue" 72 - android:layout_width="wrap_content" 73 - android:layout_height="0dp" 74 - android:layout_marginEnd="32dp" 75 - android:gravity="end|center_vertical" 76 - android:paddingStart="8dp" 77 - android:paddingEnd="8dp" 78 - android:textColor="?appTextPrimaryColor" 79 - app:layout_constraintBottom_toBottomOf="@id/spinnerSettingsDarkMode" 80 - app:layout_constraintEnd_toEndOf="@id/spinnerSettingsDarkMode" 81 - app:layout_constraintTop_toTopOf="@id/spinnerSettingsDarkMode" 82 - tools:text="@string/settings_dark_mode_system" /> 83 - 84 - <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 85 - android:id="@+id/spinnerSettingsDarkMode" 86 - android:layout_width="wrap_content" 87 - android:layout_height="0dp" 88 - android:layout_marginEnd="8dp" 89 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsDarkMode" 90 - app:layout_constraintEnd_toEndOf="parent" 91 - app:layout_constraintTop_toTopOf="@id/tvSettingsDarkMode" /> 92 - 93 - </androidx.constraintlayout.widget.ConstraintLayout> 94 - 95 - <View 96 - style="@style/SettingsDivider" 97 - android:layout_width="match_parent" /> 98 - 99 - <androidx.constraintlayout.widget.ConstraintLayout 100 - android:layout_width="match_parent" 101 - android:layout_height="wrap_content"> 102 - 103 - <androidx.appcompat.widget.AppCompatTextView 104 - android:id="@+id/tvSettingsLanguage" 105 - style="@style/SettingsText" 106 - android:layout_width="0dp" 107 - android:layout_height="wrap_content" 108 - android:text="@string/settings_language" 109 - app:layout_constraintEnd_toStartOf="@id/tvSettingsLanguageValue" 110 - app:layout_constraintStart_toStartOf="parent" 111 - app:layout_constraintTop_toTopOf="parent" /> 112 - 113 - <androidx.appcompat.widget.AppCompatTextView 114 - android:id="@+id/tvSettingsLanguageValue" 115 - android:layout_width="wrap_content" 116 - android:layout_height="0dp" 117 - android:layout_marginEnd="32dp" 118 - android:gravity="end|center_vertical" 119 - android:paddingStart="8dp" 120 - android:paddingEnd="8dp" 121 - android:textColor="?appTextPrimaryColor" 122 - app:layout_constraintBottom_toBottomOf="@id/spinnerSettingsLanguage" 123 - app:layout_constraintEnd_toEndOf="@id/spinnerSettingsLanguage" 124 - app:layout_constraintTop_toTopOf="@id/spinnerSettingsLanguage" 125 - tools:text="@string/settings_dark_mode_system" /> 126 - 127 - <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 128 - android:id="@+id/spinnerSettingsLanguage" 129 - android:layout_width="wrap_content" 130 - android:layout_height="0dp" 131 - android:layout_marginEnd="8dp" 132 - app:customSpinnerCheckable="false" 133 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsLanguage" 134 - app:layout_constraintEnd_toEndOf="parent" 135 - app:layout_constraintTop_toTopOf="@id/tvSettingsLanguage" /> 136 - 137 - </androidx.constraintlayout.widget.ConstraintLayout> 138 - 139 - <View 140 - style="@style/SettingsDivider" 141 - android:layout_width="match_parent" /> 142 - 143 - <LinearLayout 144 - android:id="@+id/layoutSettingsEditCategories" 145 - android:layout_width="match_parent" 146 - android:layout_height="wrap_content" 147 - android:background="?selectableItemBackground" 148 - android:clickable="true" 149 - android:focusable="true" 150 - android:orientation="vertical"> 151 - 152 - <androidx.appcompat.widget.AppCompatTextView 153 - style="@style/SettingsText" 154 - android:layout_width="match_parent" 155 - android:layout_height="wrap_content" 156 - android:paddingBottom="0dp" 157 - android:text="@string/settings_edit_categories" /> 158 - 159 - <androidx.appcompat.widget.AppCompatTextView 160 - style="@style/SettingsSecondaryText" 161 - android:layout_width="match_parent" 162 - android:layout_height="wrap_content" 163 - android:text="@string/settings_edit_categories_hint" /> 164 - 165 - </LinearLayout> 166 - 167 - <View 168 - style="@style/SettingsDivider" 169 - android:layout_width="match_parent" /> 170 - 171 - <androidx.appcompat.widget.AppCompatTextView 172 - android:id="@+id/tvSettingsArchive" 173 - style="@style/SettingsText" 174 - android:layout_width="match_parent" 175 - android:layout_height="wrap_content" 176 - android:background="?selectableItemBackground" 177 - android:clickable="true" 178 - android:focusable="true" 179 - android:text="@string/settings_archive" /> 180 - 181 - <View 182 - style="@style/SettingsDivider" 183 - android:layout_width="match_parent" /> 184 - 185 - <androidx.appcompat.widget.AppCompatTextView 186 - android:id="@+id/tvSettingsDataEdit" 187 - style="@style/SettingsText" 188 - android:layout_width="match_parent" 189 - android:layout_height="wrap_content" 190 - android:background="?selectableItemBackground" 191 - android:clickable="true" 192 - android:focusable="true" 193 - android:text="@string/settings_data_edit" /> 194 - 195 - </LinearLayout> 196 - 197 - </androidx.cardview.widget.CardView>
+6
features/feature_settings/src/main/res/values/dimens.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <resources> 3 + <dimen name="settings_background_height">14dp</dimen> 4 + <dimen name="settings_background_bottom_shift">-14dp</dimen> 5 + <dimen name="settings_background_height_double">28dp</dimen> 6 + </resources>
+12
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsBlock.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.adapter 2 + 3 + enum class SettingsBlock { 4 + MainTop, 5 + AllowMultitasking, 6 + DarkMode, 7 + Language, 8 + Categories, 9 + Archive, 10 + DataEdit, 11 + MainBottom, 12 + }
+21
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsBottomAdapterDelegate.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.adapter 2 + 3 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 4 + import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate 5 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBottomViewData as ViewData 6 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsBottomBinding as Binding 7 + 8 + fun createSettingsBottomAdapterDelegate() = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 9 + Binding::inflate, 10 + ) { _, _, _ -> 11 + // Nothing to bind 12 + } 13 + 14 + data class SettingsBottomViewData( 15 + val block: SettingsBlock, 16 + ) : ViewHolderType { 17 + 18 + override fun getUniqueId(): Long = block.ordinal.toLong() 19 + 20 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 21 + }
+46
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsCheckboxAdapterDelegate.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.adapter 2 + 3 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 4 + import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate 5 + import com.example.util.simpletimetracker.feature_views.extension.setOnClick 6 + import com.example.util.simpletimetracker.feature_views.extension.visible 7 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsCheckboxViewData as ViewData 8 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsCheckboxBinding as Binding 9 + 10 + fun createSettingsCheckboxAdapterDelegate( 11 + onClick: (SettingsBlock) -> Unit, 12 + ) = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 13 + Binding::inflate, 14 + ) { binding, item, _ -> 15 + 16 + with(binding) { 17 + item as ViewData 18 + 19 + tvItemSettingsTitle.text = item.title 20 + 21 + if (item.subtitle.isEmpty()) { 22 + tvItemSettingsSubtitle.visible = false 23 + } else { 24 + tvItemSettingsSubtitle.text = item.subtitle 25 + tvItemSettingsSubtitle.visible = true 26 + } 27 + 28 + if (checkboxItemSettings.isChecked != item.isChecked) { 29 + checkboxItemSettings.isChecked = item.isChecked 30 + } 31 + 32 + checkboxItemSettings.setOnClick { onClick(item.block) } 33 + } 34 + } 35 + 36 + data class SettingsCheckboxViewData( 37 + val block: SettingsBlock, 38 + val title: String, 39 + val subtitle: String, 40 + val isChecked: Boolean, 41 + ) : ViewHolderType { 42 + 43 + override fun getUniqueId(): Long = block.ordinal.toLong() 44 + 45 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 46 + }
+56
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsSpinnerAdapterDelegate.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.adapter 2 + 3 + import androidx.appcompat.widget.AppCompatTextView 4 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 5 + import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate 6 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSpinnerViewData 7 + import com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 8 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSpinnerViewData as ViewData 9 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsSpinnerBinding as Binding 10 + 11 + fun createSettingsSpinnerAdapterDelegate( 12 + onPositionSelected: (block: SettingsBlock, position: Int) -> Unit, 13 + ) = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 14 + Binding::inflate, 15 + ) { binding, item, _ -> 16 + 17 + with(binding) { 18 + item as ViewData 19 + 20 + spinnerAdapterBindDelegate( 21 + item = item, 22 + title = tvItemSettingsTitle, 23 + value = tvItemSettingsValue, 24 + spinner = spinnerItemSettings, 25 + onPositionSelected = onPositionSelected, 26 + ) 27 + } 28 + } 29 + 30 + fun spinnerAdapterBindDelegate( 31 + item: SettingsSpinnerViewData, 32 + title: AppCompatTextView, 33 + value: AppCompatTextView, 34 + spinner: CustomSpinner, 35 + onPositionSelected: (block: SettingsBlock, position: Int) -> Unit, 36 + ) { 37 + title.text = item.title 38 + value.text = item.value 39 + spinner.setProcessSameItemSelection(item.processSameItemSelected) 40 + spinner.setData(item.items, item.selectedPosition) 41 + spinner.onPositionSelected = { onPositionSelected(item.block, it) } 42 + } 43 + 44 + data class SettingsSpinnerViewData( 45 + val block: SettingsBlock, 46 + val title: String, 47 + val value: String, 48 + val items: List<CustomSpinner.CustomSpinnerItem>, 49 + val selectedPosition: Int, 50 + val processSameItemSelected: Boolean, 51 + ) : ViewHolderType { 52 + 53 + override fun getUniqueId(): Long = block.ordinal.toLong() 54 + 55 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 56 + }
+34
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsSpinnerNotCheckableAdapterDelegate.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.adapter 2 + 3 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 4 + import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate 5 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSpinnerNotCheckableViewData as ViewData 6 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsSpinnerNotCheckableBinding as Binding 7 + 8 + fun createSettingsSpinnerNotCheckableAdapterDelegate( 9 + onPositionSelected: (block: SettingsBlock, position: Int) -> Unit, 10 + ) = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 11 + Binding::inflate, 12 + ) { binding, item, _ -> 13 + 14 + with(binding) { 15 + item as ViewData 16 + 17 + spinnerAdapterBindDelegate( 18 + item = item.data, 19 + title = tvItemSettingsTitle, 20 + value = tvItemSettingsValue, 21 + spinner = spinnerItemSettings, 22 + onPositionSelected = onPositionSelected, 23 + ) 24 + } 25 + } 26 + 27 + data class SettingsSpinnerNotCheckableViewData( 28 + val data: SettingsSpinnerViewData, 29 + ) : ViewHolderType { 30 + 31 + override fun getUniqueId(): Long = data.block.ordinal.toLong() 32 + 33 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 34 + }
+48
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsTextAdapterDelegate.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.adapter 2 + 3 + import androidx.core.view.updatePadding 4 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 5 + import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate 6 + import com.example.util.simpletimetracker.feature_views.extension.dpToPx 7 + import com.example.util.simpletimetracker.feature_views.extension.setOnClick 8 + import com.example.util.simpletimetracker.feature_views.extension.visible 9 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTextViewData as ViewData 10 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsTextBinding as Binding 11 + 12 + fun createSettingsTextAdapterDelegate( 13 + onClick: (block: SettingsBlock) -> Unit, 14 + ) = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 15 + Binding::inflate, 16 + ) { binding, item, _ -> 17 + 18 + with(binding) { 19 + item as ViewData 20 + 21 + tvItemSettingsTitle.text = item.title 22 + 23 + if (item.subtitle.isEmpty()) { 24 + tvItemSettingsSubtitle.visible = false 25 + tvItemSettingsTitle.updatePadding(bottom = 12.dpToPx()) 26 + } else { 27 + tvItemSettingsSubtitle.text = item.subtitle 28 + tvItemSettingsSubtitle.visible = true 29 + tvItemSettingsTitle.updatePadding(bottom = 0.dpToPx()) 30 + } 31 + 32 + viewItemSettingsDivider.visible = item.dividerIsVisible 33 + 34 + layoutItemSettingsText.setOnClick { onClick(item.block) } 35 + } 36 + } 37 + 38 + data class SettingsTextViewData( 39 + val block: SettingsBlock, 40 + val title: String, 41 + val subtitle: String, 42 + val dividerIsVisible: Boolean = true, 43 + ) : ViewHolderType { 44 + 45 + override fun getUniqueId(): Long = block.ordinal.toLong() 46 + 47 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 48 + }
+21
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsTopAdapterDelegate.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.adapter 2 + 3 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 4 + import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate 5 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTopViewData as ViewData 6 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsTopBinding as Binding 7 + 8 + fun createSettingsTopAdapterDelegate() = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 9 + Binding::inflate, 10 + ) { _, _, _ -> 11 + // Nothing to bind 12 + } 13 + 14 + data class SettingsTopViewData( 15 + val block: SettingsBlock, 16 + ) : ViewHolderType { 17 + 18 + override fun getUniqueId(): Long = block.ordinal.toLong() 19 + 20 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 21 + }
+97
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsMainViewDataInteractor.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.interactor 2 + 3 + import com.example.util.simpletimetracker.core.interactor.LanguageInteractor 4 + import com.example.util.simpletimetracker.core.repo.ResourceRepo 5 + import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 6 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 7 + import com.example.util.simpletimetracker.feature_settings.R 8 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBlock 9 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBottomViewData 10 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsCheckboxViewData 11 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSpinnerNotCheckableViewData 12 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSpinnerViewData 13 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTextViewData 14 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTopViewData 15 + import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 16 + import com.example.util.simpletimetracker.feature_settings.viewData.DarkModeViewData 17 + import com.example.util.simpletimetracker.feature_settings.viewData.LanguageViewData 18 + import javax.inject.Inject 19 + 20 + class SettingsMainViewDataInteractor @Inject constructor( 21 + private val resourceRepo: ResourceRepo, 22 + private val settingsMapper: SettingsMapper, 23 + private val prefsInteractor: PrefsInteractor, 24 + private val languageInteractor: LanguageInteractor, 25 + ) { 26 + 27 + suspend fun execute(): List<ViewHolderType> { 28 + val result = mutableListOf<ViewHolderType>() 29 + 30 + result += SettingsTopViewData( 31 + block = SettingsBlock.MainTop, 32 + ) 33 + 34 + result += SettingsCheckboxViewData( 35 + block = SettingsBlock.AllowMultitasking, 36 + title = resourceRepo.getString(R.string.settings_allow_multitasking), 37 + subtitle = resourceRepo.getString(R.string.settings_allow_multitasking_hint), 38 + isChecked = prefsInteractor.getAllowMultitasking(), 39 + ) 40 + 41 + val darkModeViewData = loadDarkModeViewData() 42 + result += SettingsSpinnerViewData( 43 + block = SettingsBlock.DarkMode, 44 + title = resourceRepo.getString(R.string.settings_dark_mode), 45 + value = darkModeViewData.items 46 + .getOrNull(darkModeViewData.selectedPosition)?.text.orEmpty(), 47 + items = darkModeViewData.items, 48 + selectedPosition = darkModeViewData.selectedPosition, 49 + processSameItemSelected = false, 50 + ) 51 + 52 + val languageViewData = loadLanguageViewData() 53 + result += SettingsSpinnerViewData( 54 + block = SettingsBlock.Language, 55 + title = resourceRepo.getString(R.string.settings_language), 56 + value = languageViewData.currentLanguageName, 57 + items = languageViewData.items, 58 + selectedPosition = -1, 59 + processSameItemSelected = true, 60 + ).let(::SettingsSpinnerNotCheckableViewData) 61 + 62 + result += SettingsTextViewData( 63 + block = SettingsBlock.Categories, 64 + title = resourceRepo.getString(R.string.settings_edit_categories), 65 + subtitle = resourceRepo.getString(R.string.settings_edit_categories_hint), 66 + ) 67 + 68 + result += SettingsTextViewData( 69 + block = SettingsBlock.Archive, 70 + title = resourceRepo.getString(R.string.settings_archive), 71 + subtitle = "", 72 + ) 73 + 74 + result += SettingsTextViewData( 75 + block = SettingsBlock.DataEdit, 76 + title = resourceRepo.getString(R.string.settings_data_edit), 77 + subtitle = "", 78 + dividerIsVisible = false, 79 + ) 80 + 81 + result += SettingsBottomViewData( 82 + block = SettingsBlock.MainBottom, 83 + ) 84 + 85 + return result 86 + } 87 + 88 + private suspend fun loadDarkModeViewData(): DarkModeViewData { 89 + return prefsInteractor.getSelectedDarkMode() 90 + .let(settingsMapper::toDarkModeViewData) 91 + } 92 + 93 + private fun loadLanguageViewData(): LanguageViewData { 94 + return languageInteractor.getCurrentLanguage() 95 + .let(settingsMapper::toLanguageViewData) 96 + } 97 + }
+20 -40
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 15 15 import com.example.util.simpletimetracker.core.sharedViewModel.BackupViewModel 16 16 import com.example.util.simpletimetracker.core.sharedViewModel.MainTabsViewModel 17 17 import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter 18 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsBottomAdapterDelegate 19 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsCheckboxAdapterDelegate 20 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsSpinnerAdapterDelegate 21 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsSpinnerNotCheckableAdapterDelegate 22 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsTextAdapterDelegate 23 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsTopAdapterDelegate 18 24 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsTranslatorAdapterDelegate 19 25 import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 20 - import com.example.util.simpletimetracker.feature_settings.viewData.DarkModeViewData 21 26 import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 22 27 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 23 - import com.example.util.simpletimetracker.feature_settings.viewData.LanguageViewData 24 28 import com.example.util.simpletimetracker.feature_settings.viewData.RepeatButtonViewData 25 29 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 26 30 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsStartOfDayViewData ··· 62 66 createSettingsTranslatorAdapterDelegate(), 63 67 ) 64 68 } 69 + private val contentAdapter: BaseRecyclerAdapter by lazy { 70 + BaseRecyclerAdapter( 71 + createSettingsTopAdapterDelegate(), 72 + createSettingsBottomAdapterDelegate(), 73 + createSettingsTextAdapterDelegate(throttle(viewModel::onTextClicked)), 74 + createSettingsCheckboxAdapterDelegate(viewModel::onCheckboxClicked), 75 + createSettingsSpinnerAdapterDelegate(viewModel::onSpinnerPositionSelected), 76 + createSettingsSpinnerNotCheckableAdapterDelegate(viewModel::onSpinnerPositionSelected), 77 + ) 78 + } 65 79 66 80 override fun initUi() = with(binding) { 81 + rvSettingsContent.adapter = contentAdapter 67 82 layoutSettingsTranslators.rvSettingsTranslators.adapter = translatorsAdapter 68 - layoutSettingsMain.spinnerSettingsDarkMode.setProcessSameItemSelection(false) 69 83 layoutSettingsDisplay.spinnerSettingsDaysInCalendar.setProcessSameItemSelection(false) 70 84 layoutSettingsDisplay.spinnerSettingsWidgetTransparency.setProcessSameItemSelection(false) 71 85 layoutSettingsDisplay.spinnerSettingsRecordTypeSort.setProcessSameItemSelection(false) ··· 74 88 } 75 89 76 90 override fun initUx() = with(binding) { 77 - with(layoutSettingsMain) { 78 - with(viewModel.mainDelegate) { 79 - checkboxSettingsAllowMultitasking.setOnClick(::onAllowMultitaskingClicked) 80 - spinnerSettingsDarkMode.onPositionSelected = ::onDarkModeSelected 81 - spinnerSettingsLanguage.onPositionSelected = ::onLanguageSelected 82 - layoutSettingsEditCategories.setOnClick(throttle(::onEditCategoriesClick)) 83 - tvSettingsArchive.setOnClick(throttle(::onArchiveClick)) 84 - tvSettingsDataEdit.setOnClick(throttle(::onDataEditClick)) 85 - } 86 - } 87 - 88 91 with(layoutSettingsNotifications) { 89 92 with(viewModel.notificationsDelegate) { 90 93 layoutSettingsNotificationsTitle.setOnClick(viewModel::onSettingsNotificationsClick) ··· 170 173 171 174 override fun initViewModel(): Unit = with(binding) { 172 175 with(viewModel) { 176 + content.observe(contentAdapter::replace) 177 + 173 178 settingsNotificationsVisibility.observe { opened -> 174 179 layoutSettingsNotifications.layoutSettingsNotificationsContent.visible = opened 175 180 layoutSettingsNotifications.arrowSettingsNotifications ··· 202 207 } 203 208 204 209 with(viewModel.mainDelegate) { 205 - with(layoutSettingsMain) { 206 - allowMultitaskingCheckbox.observe(checkboxSettingsAllowMultitasking::setChecked) 207 - darkModeViewData.observe(::updateDarkModeViewData) 208 - languageViewData.observe(::updateLanguageViewData) 209 - themeChanged.observe(::changeTheme) 210 - } 210 + themeChanged.observe(::changeTheme) 211 211 } 212 212 213 213 with(viewModel.notificationsDelegate) { ··· 298 298 299 299 override fun onResume() = with(binding) { 300 300 super.onResume() 301 - with(layoutSettingsMain) { 302 - checkboxSettingsAllowMultitasking.jumpDrawablesToCurrentState() 303 - spinnerSettingsDarkMode.jumpDrawablesToCurrentState() 304 - spinnerSettingsLanguage.jumpDrawablesToCurrentState() 305 - } 306 301 with(layoutSettingsNotifications) { 307 302 checkboxSettingsShowNotifications.jumpDrawablesToCurrentState() 308 303 checkboxSettingsShowNotificationsControls.jumpDrawablesToCurrentState() ··· 402 397 spinnerSettingsRepeatButtonType.setData(viewData.items, viewData.selectedPosition) 403 398 tvSettingsRepeatButtonTypeValue.text = viewData.items 404 399 .getOrNull(viewData.selectedPosition)?.text.orEmpty() 405 - } 406 - 407 - private fun updateDarkModeViewData( 408 - viewData: DarkModeViewData, 409 - ) = with(binding.layoutSettingsMain) { 410 - spinnerSettingsDarkMode.setData(viewData.items, viewData.selectedPosition) 411 - tvSettingsDarkModeValue.text = viewData.items 412 - .getOrNull(viewData.selectedPosition)?.text.orEmpty() 413 - } 414 - 415 - private fun updateLanguageViewData( 416 - viewData: LanguageViewData, 417 - ) = with(binding.layoutSettingsMain) { 418 - spinnerSettingsLanguage.setData(viewData.items, -1) 419 - tvSettingsLanguageValue.text = viewData.currentLanguageName 420 400 } 421 401 422 402 private fun updateShowRecordTagSelectionChecked(
+50 -1
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt
··· 5 5 import androidx.lifecycle.viewModelScope 6 6 import com.example.util.simpletimetracker.core.base.BaseViewModel 7 7 import com.example.util.simpletimetracker.core.base.SingleLiveEvent 8 + import com.example.util.simpletimetracker.core.extension.lazySuspend 8 9 import com.example.util.simpletimetracker.core.extension.set 9 10 import com.example.util.simpletimetracker.core.model.NavigationTab 10 11 import com.example.util.simpletimetracker.domain.extension.flip 11 12 import com.example.util.simpletimetracker.domain.extension.orFalse 13 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 14 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBlock 15 + import com.example.util.simpletimetracker.feature_settings.interactor.SettingsMainViewDataInteractor 12 16 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 13 17 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsAdditionalViewModelDelegate 14 18 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsDisplayViewModelDelegate ··· 34 38 val translatorsDelegate: SettingsTranslatorsViewModelDelegate, 35 39 private val router: Router, 36 40 private val settingsMapper: SettingsMapper, 41 + private val settingsMainViewDataInteractor: SettingsMainViewDataInteractor, 37 42 ) : BaseViewModel(), SettingsParent { 38 43 44 + val content: LiveData<List<ViewHolderType>> by lazySuspend { loadContent() } 39 45 val settingsNotificationsVisibility: LiveData<Boolean> = MutableLiveData(false) 40 46 val settingsDisplayVisibility: LiveData<Boolean> = MutableLiveData(false) 41 47 val settingsAdditionalVisibility: LiveData<Boolean> = MutableLiveData(false) ··· 44 50 val resetScreen: SingleLiveEvent<Unit> = SingleLiveEvent() 45 51 46 52 init { 53 + mainDelegate.init(this) 47 54 notificationsDelegate.init(this) 48 55 displayDelegate.init(this) 49 56 additionalDelegate.init(this) ··· 65 72 } 66 73 67 74 fun onVisible() { 68 - mainDelegate.onVisible() 69 75 displayDelegate.onVisible() 70 76 additionalDelegate.onVisible() 77 + // Update can come from quick settings widget. 78 + // Update can come from system settings. 79 + viewModelScope.launch { updateContent() } 80 + } 81 + 82 + fun onTextClicked(block: SettingsBlock) { 83 + when (block) { 84 + SettingsBlock.Categories -> mainDelegate.onEditCategoriesClick() 85 + SettingsBlock.Archive -> mainDelegate.onArchiveClick() 86 + SettingsBlock.DataEdit -> mainDelegate.onDataEditClick() 87 + else -> { 88 + // Do nothing 89 + } 90 + } 91 + } 92 + 93 + fun onCheckboxClicked(block: SettingsBlock) { 94 + when (block) { 95 + SettingsBlock.AllowMultitasking -> mainDelegate.onAllowMultitaskingClicked() 96 + else -> { 97 + // Do nothing 98 + } 99 + } 100 + } 101 + 102 + fun onSpinnerPositionSelected(block: SettingsBlock, position: Int) { 103 + when (block) { 104 + SettingsBlock.DarkMode -> mainDelegate.onDarkModeSelected(position) 105 + SettingsBlock.Language -> mainDelegate.onLanguageSelected(position) 106 + else -> { 107 + // Do nothing 108 + } 109 + } 71 110 } 72 111 73 112 fun onSettingsNotificationsClick() { ··· 151 190 timestamp = timestamp.let(settingsMapper::startOfDayShiftToTimeStamp), 152 191 useMilitaryTime = useMilitaryTime, 153 192 ).let(router::navigate) 193 + } 194 + 195 + override suspend fun updateContent() { 196 + content.set(loadContent()) 197 + } 198 + 199 + private suspend fun loadContent(): List<ViewHolderType> { 200 + val result = mutableListOf<ViewHolderType>() 201 + result += settingsMainViewDataInteractor.execute() 202 + return result 154 203 } 155 204 156 205 companion object {
+11 -41
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsMainViewModelDelegate.kt
··· 1 1 package com.example.util.simpletimetracker.feature_settings.viewModel.delegate 2 2 3 - import androidx.lifecycle.LiveData 4 3 import com.example.util.simpletimetracker.core.base.SingleLiveEvent 5 4 import com.example.util.simpletimetracker.core.base.ViewModelDelegate 6 - import com.example.util.simpletimetracker.core.extension.lazySuspend 7 5 import com.example.util.simpletimetracker.core.extension.set 8 6 import com.example.util.simpletimetracker.core.interactor.LanguageInteractor 9 7 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 10 8 import com.example.util.simpletimetracker.domain.interactor.WidgetInteractor 11 9 import com.example.util.simpletimetracker.domain.model.WidgetType 12 10 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 13 - import com.example.util.simpletimetracker.feature_settings.viewData.DarkModeViewData 14 - import com.example.util.simpletimetracker.feature_settings.viewData.LanguageViewData 15 11 import com.example.util.simpletimetracker.navigation.Router 16 12 import com.example.util.simpletimetracker.navigation.params.screen.ArchiveParams 17 13 import com.example.util.simpletimetracker.navigation.params.screen.CategoriesParams ··· 27 23 private val widgetInteractor: WidgetInteractor, 28 24 ) : ViewModelDelegate() { 29 25 30 - val allowMultitaskingCheckbox: LiveData<Boolean> 31 - by lazySuspend { prefsInteractor.getAllowMultitasking() } 32 - val darkModeViewData: LiveData<DarkModeViewData> 33 - by lazySuspend { loadDarkModeViewData() } 34 - val languageViewData: LiveData<LanguageViewData> 35 - by lazySuspend { loadLanguageViewData() } 36 26 val themeChanged: SingleLiveEvent<Boolean> = SingleLiveEvent() 37 27 38 - fun onVisible() { 39 - delegateScope.launch { 40 - // Update can come from quick settings widget 41 - allowMultitaskingCheckbox.set(prefsInteractor.getAllowMultitasking()) 28 + private var parent: SettingsParent? = null 42 29 43 - // Update can come from system settings 44 - updateLanguageViewData() 45 - } 30 + fun init(parent: SettingsParent) { 31 + this.parent = parent 46 32 } 47 33 48 34 fun onEditCategoriesClick() { ··· 62 48 val newValue = !prefsInteractor.getAllowMultitasking() 63 49 prefsInteractor.setAllowMultitasking(newValue) 64 50 widgetInteractor.updateWidgets(listOf(WidgetType.QUICK_SETTINGS)) 65 - allowMultitaskingCheckbox.set(newValue) 51 + parent?.updateContent() 66 52 } 67 53 } 68 54 ··· 73 59 if (newMode == currentMode) return@launch 74 60 75 61 prefsInteractor.setDarkMode(newMode) 76 - updateDarkModeViewData() 62 + parent?.updateContent() 77 63 themeChanged.set(true) 78 64 } 79 65 } 80 66 81 67 fun onLanguageSelected(position: Int) { 82 - val newLanguage = settingsMapper.toLanguage(position) 83 - languageInteractor.setLanguage(newLanguage) 84 - updateLanguageViewData() 85 - router.restartApp() 86 - } 87 - 88 - private suspend fun updateDarkModeViewData() { 89 - darkModeViewData.set(loadDarkModeViewData()) 90 - } 91 - 92 - private suspend fun loadDarkModeViewData(): DarkModeViewData { 93 - return prefsInteractor.getSelectedDarkMode() 94 - .let(settingsMapper::toDarkModeViewData) 95 - } 96 - 97 - private fun updateLanguageViewData() { 98 - languageViewData.set(loadLanguageViewData()) 99 - } 100 - 101 - private fun loadLanguageViewData(): LanguageViewData { 102 - return languageInteractor.getCurrentLanguage() 103 - .let(settingsMapper::toLanguageViewData) 68 + delegateScope.launch { 69 + val newLanguage = settingsMapper.toLanguage(position) 70 + languageInteractor.setLanguage(newLanguage) 71 + parent?.updateContent() 72 + router.restartApp() 73 + } 104 74 } 105 75 }
+2
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsParent.kt
··· 9 9 ) 10 10 11 11 suspend fun onUseMilitaryTimeClicked() 12 + 13 + suspend fun updateContent() 12 14 }