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 notifications settings block to recycler

razeeman (Jan 8, 2024, 7:54 PM +0300) f4d706c5 1d8d10d6

+634 -605
-2
features/feature_settings/src/main/res/layout/item_settings_checkbox.xml
··· 27 27 app:layout_constraintEnd_toStartOf="@id/checkboxItemSettings" 28 28 app:layout_constraintStart_toStartOf="parent" 29 29 app:layout_constraintTop_toTopOf="parent" 30 - app:layout_goneMarginEnd="4dp" 31 30 tools:text="Title" /> 32 31 33 32 <androidx.appcompat.widget.AppCompatTextView ··· 42 41 app:layout_constraintEnd_toStartOf="@id/checkboxItemSettings" 43 42 app:layout_constraintStart_toStartOf="parent" 44 43 app:layout_constraintTop_toBottomOf="@id/tvItemSettingsTitle" 45 - app:layout_goneMarginEnd="4dp" 46 44 tools:text="Subtitle" 47 45 tools:visibility="visible" /> 48 46
+58
features/feature_settings/src/main/res/layout/item_settings_collapse.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.constraintlayout.widget.ConstraintLayout 17 + android:id="@+id/layoutItemSettingsCollapseTitle" 18 + android:layout_width="match_parent" 19 + android:layout_height="wrap_content" 20 + android:layout_marginStart="4dp" 21 + android:layout_marginEnd="4dp" 22 + android:background="?selectableItemBackground" 23 + android:translationZ="4dp" 24 + app:layout_constraintTop_toTopOf="parent"> 25 + 26 + <androidx.appcompat.widget.AppCompatTextView 27 + android:id="@+id/tvItemSettingsCollapseTitle" 28 + style="@style/SettingsText" 29 + android:layout_width="0dp" 30 + android:layout_height="wrap_content" 31 + app:layout_constraintEnd_toStartOf="@id/arrowItemSettingsCollapse" 32 + app:layout_constraintStart_toStartOf="parent" 33 + app:layout_constraintTop_toTopOf="parent" 34 + tools:text="Title" /> 35 + 36 + <ImageView 37 + android:id="@+id/arrowItemSettingsCollapse" 38 + android:layout_width="24dp" 39 + android:layout_height="24dp" 40 + android:layout_marginEnd="16dp" 41 + android:background="?selectableItemBackgroundBorderless" 42 + android:src="?appArrow" 43 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsCollapseTitle" 44 + app:layout_constraintEnd_toEndOf="parent" 45 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsCollapseTitle" 46 + tools:ignore="ContentDescription" /> 47 + 48 + </androidx.constraintlayout.widget.ConstraintLayout> 49 + 50 + <View 51 + android:id="@+id/viewItemSettingsDivider" 52 + style="@style/SettingsDivider" 53 + android:layout_width="match_parent" 54 + android:layout_marginHorizontal="12dp" 55 + android:translationZ="4dp" 56 + app:layout_constraintTop_toBottomOf="@id/layoutItemSettingsCollapseTitle" /> 57 + 58 + </androidx.constraintlayout.widget.ConstraintLayout>
+80
features/feature_settings/src/main/res/layout/item_settings_range.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_constraintBottom_toTopOf="@id/tvItemSettingsTitle" 24 + app:layout_constraintEnd_toStartOf="@id/tvItemSettingsStart" 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/tvItemSettingsStart" 31 + android:layout_width="wrap_content" 32 + android:layout_height="wrap_content" 33 + android:background="?selectableItemBackgroundBorderless" 34 + android:gravity="center" 35 + android:paddingHorizontal="8dp" 36 + android:paddingVertical="4dp" 37 + android:translationZ="4dp" 38 + android:textColor="?appTextPrimaryColor" 39 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsTitle" 40 + app:layout_constraintEnd_toStartOf="@id/tvItemSettingsDivider" 41 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsTitle" 42 + tools:text="01:23" /> 43 + 44 + <androidx.appcompat.widget.AppCompatTextView 45 + android:id="@+id/tvItemSettingsDivider" 46 + android:layout_width="wrap_content" 47 + android:layout_height="wrap_content" 48 + android:gravity="end|center_vertical" 49 + android:text="-" 50 + android:translationZ="4dp" 51 + android:textColor="?appTextPrimaryColor" 52 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsTitle" 53 + app:layout_constraintEnd_toStartOf="@id/tvItemSettingsEnd" 54 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsTitle" /> 55 + 56 + <androidx.appcompat.widget.AppCompatTextView 57 + android:id="@+id/tvItemSettingsEnd" 58 + android:layout_width="wrap_content" 59 + android:layout_height="match_parent" 60 + android:layout_marginEnd="20dp" 61 + android:background="?selectableItemBackgroundBorderless" 62 + android:gravity="center" 63 + android:paddingHorizontal="8dp" 64 + android:paddingVertical="4dp" 65 + android:translationZ="4dp" 66 + android:textColor="?appTextPrimaryColor" 67 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsTitle" 68 + app:layout_constraintEnd_toEndOf="parent" 69 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsTitle" 70 + tools:text="01:23" /> 71 + 72 + <View 73 + android:id="@+id/viewItemSettingsDivider" 74 + style="@style/SettingsDivider" 75 + android:layout_width="match_parent" 76 + android:layout_marginHorizontal="12dp" 77 + android:translationZ="4dp" 78 + app:layout_constraintTop_toBottomOf="@id/tvItemSettingsTitle" /> 79 + 80 + </androidx.constraintlayout.widget.ConstraintLayout>
+93
features/feature_settings/src/main/res/layout/item_settings_selector.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/groupItemSettingsSelector" 28 + app:layout_constraintStart_toStartOf="parent" 29 + app:layout_constraintTop_toTopOf="parent" 30 + tools:text="Title" /> 31 + 32 + <androidx.appcompat.widget.AppCompatTextView 33 + android:id="@+id/tvItemSettingsSubtitle" 34 + style="@style/SettingsSecondaryText" 35 + android:layout_width="0dp" 36 + android:layout_height="wrap_content" 37 + android:layout_marginStart="4dp" 38 + android:paddingBottom="0dp" 39 + android:translationZ="4dp" 40 + android:visibility="gone" 41 + app:layout_constraintEnd_toStartOf="@id/groupItemSettingsSelector" 42 + app:layout_constraintStart_toStartOf="parent" 43 + app:layout_constraintTop_toBottomOf="@id/tvItemSettingsTitle" 44 + app:layout_goneMarginEnd="4dp" 45 + tools:text="Subtitle" 46 + tools:visibility="visible" /> 47 + 48 + <androidx.appcompat.widget.LinearLayoutCompat 49 + android:id="@+id/groupItemSettingsSelector" 50 + android:layout_width="wrap_content" 51 + android:layout_height="wrap_content" 52 + android:layout_marginTop="12dp" 53 + android:layout_marginEnd="4dp" 54 + android:orientation="horizontal" 55 + android:translationZ="4dp" 56 + app:layout_constraintEnd_toEndOf="parent" 57 + app:layout_constraintTop_toTopOf="parent"> 58 + 59 + <androidx.appcompat.widget.AppCompatTextView 60 + android:id="@+id/tvItemSettingsSelectorValue" 61 + android:layout_width="wrap_content" 62 + android:layout_height="match_parent" 63 + android:gravity="end|center_vertical" 64 + android:paddingHorizontal="8dp" 65 + android:textColor="?appTextPrimaryColor" 66 + tools:text="99h 99m 99s" /> 67 + 68 + <androidx.appcompat.widget.AppCompatImageView 69 + android:id="@+id/arrowItemSettingsSelector" 70 + android:layout_width="24dp" 71 + android:layout_height="24dp" 72 + android:layout_marginEnd="16dp" 73 + android:background="?selectableItemBackgroundBorderless" 74 + android:src="?appArrow" 75 + tools:ignore="ContentDescription" /> 76 + 77 + </androidx.appcompat.widget.LinearLayoutCompat> 78 + 79 + <Space 80 + android:id="@+id/spaceItemSettingsBottom" 81 + android:layout_width="match_parent" 82 + android:layout_height="12dp" 83 + app:layout_constraintTop_toBottomOf="@id/tvItemSettingsSubtitle" /> 84 + 85 + <View 86 + android:id="@+id/viewItemSettingsDivider" 87 + style="@style/SettingsDivider" 88 + android:layout_width="match_parent" 89 + android:layout_marginHorizontal="12dp" 90 + android:translationZ="4dp" 91 + app:layout_constraintTop_toBottomOf="@id/spaceItemSettingsBottom" /> 92 + 93 + </androidx.constraintlayout.widget.ConstraintLayout>
-4
features/feature_settings/src/main/res/layout/settings_fragment.xml
··· 23 23 tools:listitem="@layout/item_settings_text" /> 24 24 25 25 <include 26 - android:id="@+id/layoutSettingsNotifications" 27 - layout="@layout/settings_notifications_layout" /> 28 - 29 - <include 30 26 android:id="@+id/layoutSettingsDisplay" 31 27 layout="@layout/settings_display_layout" /> 32 28
-413
features/feature_settings/src/main/res/layout/settings_notifications_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 - <androidx.appcompat.widget.LinearLayoutCompat 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:id="@+id/layoutSettingsNotificationsTitle" 18 - android:layout_width="match_parent" 19 - android:layout_height="wrap_content" 20 - android:background="?selectableItemBackground"> 21 - 22 - <androidx.appcompat.widget.AppCompatTextView 23 - android:id="@+id/tvSettingsNotificationsTitle" 24 - style="@style/SettingsText" 25 - android:layout_width="0dp" 26 - android:layout_height="wrap_content" 27 - android:text="@string/settings_notification_title" 28 - app:layout_constraintEnd_toStartOf="@id/arrowSettingsNotifications" 29 - app:layout_constraintStart_toStartOf="parent" 30 - app:layout_constraintTop_toTopOf="parent" /> 31 - 32 - <ImageView 33 - android:id="@+id/arrowSettingsNotifications" 34 - android:layout_width="24dp" 35 - android:layout_height="24dp" 36 - android:layout_marginEnd="16dp" 37 - android:background="?selectableItemBackgroundBorderless" 38 - android:src="?appArrow" 39 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsNotificationsTitle" 40 - app:layout_constraintEnd_toEndOf="parent" 41 - app:layout_constraintTop_toTopOf="@id/tvSettingsNotificationsTitle" 42 - tools:ignore="ContentDescription" /> 43 - 44 - </androidx.constraintlayout.widget.ConstraintLayout> 45 - 46 - <androidx.appcompat.widget.LinearLayoutCompat 47 - android:id="@+id/layoutSettingsNotificationsContent" 48 - android:layout_width="match_parent" 49 - android:layout_height="wrap_content" 50 - android:orientation="vertical" 51 - android:visibility="gone" 52 - tools:visibility="visible"> 53 - 54 - <View 55 - style="@style/SettingsDivider" 56 - android:layout_width="match_parent" /> 57 - 58 - <androidx.constraintlayout.widget.ConstraintLayout 59 - android:layout_width="match_parent" 60 - android:layout_height="wrap_content" 61 - android:paddingTop="12dp"> 62 - 63 - <androidx.appcompat.widget.AppCompatTextView 64 - android:id="@+id/tvSettingsShowNotifications" 65 - style="@style/SettingsText" 66 - android:layout_width="0dp" 67 - android:layout_height="wrap_content" 68 - android:paddingTop="0dp" 69 - android:paddingBottom="0dp" 70 - android:text="@string/settings_show_notifications" 71 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsShowNotifications" 72 - app:layout_constraintStart_toStartOf="parent" 73 - app:layout_constraintTop_toTopOf="parent" /> 74 - 75 - <androidx.appcompat.widget.AppCompatTextView 76 - android:id="@+id/tvSettingsShowNotificationsHint" 77 - style="@style/SettingsSecondaryText" 78 - android:layout_width="0dp" 79 - android:layout_height="wrap_content" 80 - android:paddingBottom="0dp" 81 - android:text="@string/settings_show_notifications_hint" 82 - app:layout_constraintBottom_toTopOf="@id/tvSettingsShowNotificationsControls" 83 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsShowNotifications" 84 - app:layout_constraintStart_toStartOf="parent" 85 - app:layout_constraintTop_toBottomOf="@id/tvSettingsShowNotifications" 86 - app:layout_goneMarginBottom="12dp" /> 87 - 88 - <androidx.appcompat.widget.AppCompatCheckBox 89 - android:id="@+id/checkboxSettingsShowNotifications" 90 - android:layout_width="wrap_content" 91 - android:layout_height="0dp" 92 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsShowNotifications" 93 - app:layout_constraintEnd_toEndOf="parent" 94 - app:layout_constraintTop_toTopOf="@id/tvSettingsShowNotifications" /> 95 - 96 - <androidx.appcompat.widget.AppCompatTextView 97 - android:id="@+id/tvSettingsShowNotificationsControls" 98 - style="@style/SettingsText" 99 - android:layout_width="0dp" 100 - android:layout_height="wrap_content" 101 - android:text="@string/settings_show_notifications_controls" 102 - app:layout_constraintBottom_toBottomOf="parent" 103 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsShowNotificationsControls" 104 - app:layout_constraintStart_toStartOf="parent" 105 - app:layout_constraintTop_toBottomOf="@id/tvSettingsShowNotificationsHint" /> 106 - 107 - <androidx.appcompat.widget.AppCompatCheckBox 108 - android:id="@+id/checkboxSettingsShowNotificationsControls" 109 - android:layout_width="wrap_content" 110 - android:layout_height="0dp" 111 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsShowNotificationsControls" 112 - app:layout_constraintEnd_toEndOf="parent" 113 - app:layout_constraintTop_toTopOf="@id/tvSettingsShowNotificationsControls" /> 114 - 115 - <androidx.constraintlayout.widget.Group 116 - android:id="@+id/groupSettingsShowNotifications" 117 - android:layout_width="match_parent" 118 - android:layout_height="match_parent" 119 - android:visibility="gone" 120 - app:constraint_referenced_ids="tvSettingsShowNotificationsControls, checkboxSettingsShowNotificationsControls" 121 - tools:visibility="visible" /> 122 - 123 - </androidx.constraintlayout.widget.ConstraintLayout> 124 - 125 - <View 126 - style="@style/SettingsDivider" 127 - android:layout_width="match_parent" /> 128 - 129 - <androidx.constraintlayout.widget.ConstraintLayout 130 - android:layout_width="match_parent" 131 - android:layout_height="wrap_content" 132 - android:paddingTop="12dp"> 133 - 134 - <androidx.appcompat.widget.AppCompatTextView 135 - android:id="@+id/tvSettingsInactivityReminder" 136 - style="@style/SettingsText" 137 - android:layout_width="0dp" 138 - android:layout_height="wrap_content" 139 - android:paddingTop="0dp" 140 - android:paddingBottom="0dp" 141 - android:text="@string/settings_inactivity_reminder" 142 - app:layout_constraintEnd_toStartOf="@id/groupSettingsInactivityReminder" 143 - app:layout_constraintStart_toStartOf="parent" 144 - app:layout_constraintTop_toTopOf="parent" /> 145 - 146 - <androidx.appcompat.widget.AppCompatTextView 147 - android:id="@+id/tvSettingsInactivityReminderHint" 148 - style="@style/SettingsSecondaryText" 149 - android:layout_width="0dp" 150 - android:layout_height="wrap_content" 151 - android:paddingBottom="0dp" 152 - android:text="@string/settings_inactivity_reminder_hint" 153 - app:layout_constraintBottom_toTopOf="@id/tvSettingsInactivityReminderRecurrentHint" 154 - app:layout_constraintEnd_toStartOf="@id/groupSettingsInactivityReminder" 155 - app:layout_constraintStart_toStartOf="parent" 156 - app:layout_constraintTop_toBottomOf="@id/tvSettingsInactivityReminder" 157 - app:layout_goneMarginBottom="12dp" /> 158 - 159 - <androidx.appcompat.widget.LinearLayoutCompat 160 - android:id="@+id/groupSettingsInactivityReminder" 161 - android:layout_width="wrap_content" 162 - android:layout_height="wrap_content" 163 - android:orientation="horizontal" 164 - app:layout_constraintEnd_toEndOf="parent" 165 - app:layout_constraintTop_toTopOf="parent"> 166 - 167 - <androidx.appcompat.widget.AppCompatTextView 168 - android:id="@+id/tvSettingsInactivityReminderTime" 169 - android:layout_width="wrap_content" 170 - android:layout_height="match_parent" 171 - android:gravity="end|center_vertical" 172 - android:paddingHorizontal="8dp" 173 - android:textColor="?appTextPrimaryColor" 174 - tools:text="99h 99m 99s" /> 175 - 176 - <androidx.appcompat.widget.AppCompatImageView 177 - android:id="@+id/arrowSettingsInactivityReminder" 178 - android:layout_width="24dp" 179 - android:layout_height="24dp" 180 - android:layout_marginEnd="16dp" 181 - android:background="?selectableItemBackgroundBorderless" 182 - android:src="?appArrow" 183 - tools:ignore="ContentDescription" /> 184 - 185 - </androidx.appcompat.widget.LinearLayoutCompat> 186 - 187 - <androidx.appcompat.widget.AppCompatTextView 188 - android:id="@+id/tvSettingsInactivityReminderRecurrentHint" 189 - style="@style/SettingsText" 190 - android:layout_width="0dp" 191 - android:layout_height="wrap_content" 192 - android:paddingBottom="0dp" 193 - android:text="@string/settings_inactivity_reminder_recurrent" 194 - app:layout_constraintBottom_toTopOf="@id/tvSettingsInactivityReminderDoNotDisturb" 195 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsInactivityReminderRecurrent" 196 - app:layout_constraintStart_toStartOf="parent" 197 - app:layout_constraintTop_toBottomOf="@id/tvSettingsInactivityReminderHint" /> 198 - 199 - <androidx.appcompat.widget.AppCompatCheckBox 200 - android:id="@+id/checkboxSettingsInactivityReminderRecurrent" 201 - android:layout_width="wrap_content" 202 - android:layout_height="0dp" 203 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsInactivityReminderRecurrentHint" 204 - app:layout_constraintEnd_toEndOf="parent" 205 - app:layout_constraintTop_toTopOf="@id/tvSettingsInactivityReminderRecurrentHint" /> 206 - 207 - <androidx.appcompat.widget.AppCompatTextView 208 - android:id="@+id/tvSettingsInactivityReminderDoNotDisturb" 209 - style="@style/SettingsText" 210 - android:layout_width="0dp" 211 - android:layout_height="wrap_content" 212 - android:text="@string/settings_do_not_disturb" 213 - app:layout_constraintEnd_toStartOf="@id/tvSettingsInactivityReminderDndStart" 214 - app:layout_constraintStart_toStartOf="parent" 215 - app:layout_constraintTop_toBottomOf="@+id/tvSettingsInactivityReminderRecurrentHint" /> 216 - 217 - <androidx.appcompat.widget.AppCompatTextView 218 - android:id="@+id/tvSettingsInactivityReminderDndStart" 219 - android:layout_width="wrap_content" 220 - android:layout_height="wrap_content" 221 - android:background="?selectableItemBackgroundBorderless" 222 - android:gravity="center" 223 - android:paddingHorizontal="8dp" 224 - android:paddingVertical="4dp" 225 - android:textColor="?appTextPrimaryColor" 226 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsInactivityReminderDoNotDisturb" 227 - app:layout_constraintEnd_toStartOf="@id/tvSettingsInactivityReminderDndDivider" 228 - app:layout_constraintTop_toTopOf="@id/tvSettingsInactivityReminderDoNotDisturb" 229 - tools:text="01:23" /> 230 - 231 - <androidx.appcompat.widget.AppCompatTextView 232 - android:id="@+id/tvSettingsInactivityReminderDndDivider" 233 - android:layout_width="wrap_content" 234 - android:layout_height="wrap_content" 235 - android:gravity="end|center_vertical" 236 - android:text="-" 237 - android:textColor="?appTextPrimaryColor" 238 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsInactivityReminderDoNotDisturb" 239 - app:layout_constraintEnd_toStartOf="@id/tvSettingsInactivityReminderDndEnd" 240 - app:layout_constraintTop_toTopOf="@id/tvSettingsInactivityReminderDoNotDisturb" /> 241 - 242 - <androidx.appcompat.widget.AppCompatTextView 243 - android:id="@+id/tvSettingsInactivityReminderDndEnd" 244 - android:layout_width="wrap_content" 245 - android:layout_height="match_parent" 246 - android:layout_marginEnd="16dp" 247 - android:background="?selectableItemBackgroundBorderless" 248 - android:gravity="center" 249 - android:paddingHorizontal="8dp" 250 - android:paddingVertical="4dp" 251 - android:textColor="?appTextPrimaryColor" 252 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsInactivityReminderDoNotDisturb" 253 - app:layout_constraintEnd_toEndOf="parent" 254 - app:layout_constraintTop_toTopOf="@id/tvSettingsInactivityReminderDoNotDisturb" 255 - tools:text="01:23" /> 256 - 257 - <androidx.constraintlayout.widget.Group 258 - android:id="@+id/groupSettingsInactivityReminderRecurrent" 259 - android:layout_width="match_parent" 260 - android:layout_height="match_parent" 261 - android:visibility="gone" 262 - app:constraint_referenced_ids="tvSettingsInactivityReminderRecurrentHint, checkboxSettingsInactivityReminderRecurrent, tvSettingsInactivityReminderDoNotDisturb, tvSettingsInactivityReminderDndDivider, tvSettingsInactivityReminderDndStart, tvSettingsInactivityReminderDndEnd" 263 - tools:visibility="visible" /> 264 - 265 - </androidx.constraintlayout.widget.ConstraintLayout> 266 - 267 - <View 268 - style="@style/SettingsDivider" 269 - android:layout_width="match_parent" /> 270 - 271 - <androidx.constraintlayout.widget.ConstraintLayout 272 - android:layout_width="match_parent" 273 - android:layout_height="wrap_content" 274 - android:paddingTop="12dp"> 275 - 276 - <androidx.appcompat.widget.AppCompatTextView 277 - android:id="@+id/tvSettingsActivityReminder" 278 - style="@style/SettingsText" 279 - android:layout_width="0dp" 280 - android:layout_height="wrap_content" 281 - android:paddingTop="0dp" 282 - android:paddingBottom="0dp" 283 - android:text="@string/settings_activity_reminder" 284 - app:layout_constraintEnd_toStartOf="@id/groupSettingsActivityReminder" 285 - app:layout_constraintStart_toStartOf="parent" 286 - app:layout_constraintTop_toTopOf="parent" /> 287 - 288 - <androidx.appcompat.widget.AppCompatTextView 289 - android:id="@+id/tvSettingsActivityReminderHint" 290 - style="@style/SettingsSecondaryText" 291 - android:layout_width="0dp" 292 - android:layout_height="wrap_content" 293 - android:paddingBottom="0dp" 294 - android:text="@string/settings_activity_reminder_hint" 295 - app:layout_constraintBottom_toTopOf="@id/tvSettingsActivityReminderRecurrentHint" 296 - app:layout_constraintEnd_toStartOf="@id/groupSettingsActivityReminder" 297 - app:layout_constraintStart_toStartOf="parent" 298 - app:layout_constraintTop_toBottomOf="@id/tvSettingsActivityReminder" 299 - app:layout_goneMarginBottom="12dp" /> 300 - 301 - <androidx.appcompat.widget.LinearLayoutCompat 302 - android:id="@+id/groupSettingsActivityReminder" 303 - android:layout_width="wrap_content" 304 - android:layout_height="wrap_content" 305 - android:orientation="horizontal" 306 - app:layout_constraintEnd_toEndOf="parent" 307 - app:layout_constraintTop_toTopOf="parent"> 308 - 309 - <androidx.appcompat.widget.AppCompatTextView 310 - android:id="@+id/tvSettingsActivityReminderTime" 311 - android:layout_width="wrap_content" 312 - android:layout_height="match_parent" 313 - android:gravity="end|center_vertical" 314 - android:paddingHorizontal="8dp" 315 - android:textColor="?appTextPrimaryColor" 316 - tools:text="99h 99m 99s" /> 317 - 318 - <androidx.appcompat.widget.AppCompatImageView 319 - android:id="@+id/arrowSettingsActivityReminder" 320 - android:layout_width="24dp" 321 - android:layout_height="24dp" 322 - android:layout_marginEnd="16dp" 323 - android:background="?selectableItemBackgroundBorderless" 324 - android:src="?appArrow" 325 - tools:ignore="ContentDescription" /> 326 - 327 - </androidx.appcompat.widget.LinearLayoutCompat> 328 - 329 - <androidx.appcompat.widget.AppCompatTextView 330 - android:id="@+id/tvSettingsActivityReminderRecurrentHint" 331 - style="@style/SettingsText" 332 - android:layout_width="0dp" 333 - android:layout_height="wrap_content" 334 - android:paddingBottom="0dp" 335 - android:text="@string/settings_inactivity_reminder_recurrent" 336 - app:layout_constraintBottom_toTopOf="@+id/tvSettingsActivityReminderDoNotDisturb" 337 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsActivityReminderRecurrent" 338 - app:layout_constraintStart_toStartOf="parent" 339 - app:layout_constraintTop_toBottomOf="@id/tvSettingsActivityReminderHint" /> 340 - 341 - <androidx.appcompat.widget.AppCompatCheckBox 342 - android:id="@+id/checkboxSettingsActivityReminderRecurrent" 343 - android:layout_width="wrap_content" 344 - android:layout_height="0dp" 345 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsActivityReminderRecurrentHint" 346 - app:layout_constraintEnd_toEndOf="parent" 347 - app:layout_constraintTop_toTopOf="@id/tvSettingsActivityReminderRecurrentHint" /> 348 - 349 - <androidx.appcompat.widget.AppCompatTextView 350 - android:id="@+id/tvSettingsActivityReminderDoNotDisturb" 351 - style="@style/SettingsText" 352 - android:layout_width="0dp" 353 - android:layout_height="wrap_content" 354 - android:text="@string/settings_do_not_disturb" 355 - app:layout_constraintEnd_toStartOf="@id/tvSettingsActivityReminderDndStart" 356 - app:layout_constraintStart_toStartOf="parent" 357 - app:layout_constraintTop_toBottomOf="@+id/tvSettingsActivityReminderRecurrentHint" /> 358 - 359 - <androidx.appcompat.widget.AppCompatTextView 360 - android:id="@+id/tvSettingsActivityReminderDndStart" 361 - android:layout_width="wrap_content" 362 - android:layout_height="wrap_content" 363 - android:background="?selectableItemBackgroundBorderless" 364 - android:gravity="center" 365 - android:paddingHorizontal="8dp" 366 - android:paddingVertical="4dp" 367 - android:textColor="?appTextPrimaryColor" 368 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsActivityReminderDoNotDisturb" 369 - app:layout_constraintEnd_toStartOf="@id/tvSettingsActivityReminderDndDivider" 370 - app:layout_constraintTop_toTopOf="@id/tvSettingsActivityReminderDoNotDisturb" 371 - tools:text="01:23" /> 372 - 373 - <androidx.appcompat.widget.AppCompatTextView 374 - android:id="@+id/tvSettingsActivityReminderDndDivider" 375 - android:layout_width="wrap_content" 376 - android:layout_height="wrap_content" 377 - android:gravity="end|center_vertical" 378 - android:text="-" 379 - android:textColor="?appTextPrimaryColor" 380 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsActivityReminderDoNotDisturb" 381 - app:layout_constraintEnd_toStartOf="@id/tvSettingsActivityReminderDndEnd" 382 - app:layout_constraintTop_toTopOf="@id/tvSettingsActivityReminderDoNotDisturb" /> 383 - 384 - <androidx.appcompat.widget.AppCompatTextView 385 - android:id="@+id/tvSettingsActivityReminderDndEnd" 386 - android:layout_width="wrap_content" 387 - android:layout_height="match_parent" 388 - android:layout_marginEnd="16dp" 389 - android:background="?selectableItemBackgroundBorderless" 390 - android:gravity="center" 391 - android:paddingHorizontal="8dp" 392 - android:paddingVertical="4dp" 393 - android:textColor="?appTextPrimaryColor" 394 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsActivityReminderDoNotDisturb" 395 - app:layout_constraintEnd_toEndOf="parent" 396 - app:layout_constraintTop_toTopOf="@id/tvSettingsActivityReminderDoNotDisturb" 397 - tools:text="01:23" /> 398 - 399 - <androidx.constraintlayout.widget.Group 400 - android:id="@+id/groupSettingsActivityReminderRecurrent" 401 - android:layout_width="match_parent" 402 - android:layout_height="match_parent" 403 - android:visibility="gone" 404 - app:constraint_referenced_ids="tvSettingsActivityReminderRecurrentHint, checkboxSettingsActivityReminderRecurrent, tvSettingsActivityReminderDoNotDisturb, tvSettingsActivityReminderDndStart, tvSettingsActivityReminderDndDivider, tvSettingsActivityReminderDndEnd" 405 - tools:visibility="visible" /> 406 - 407 - </androidx.constraintlayout.widget.ConstraintLayout> 408 - 409 - </androidx.appcompat.widget.LinearLayoutCompat> 410 - 411 - </androidx.appcompat.widget.LinearLayoutCompat> 412 - 413 - </androidx.cardview.widget.CardView>
+12
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsBlock.kt
··· 15 15 Feedback, 16 16 Version, 17 17 RatingBottom, 18 + 19 + NotificationsTop, 20 + NotificationsCollapse, 21 + NotificationsShow, 22 + NotificationsShowControls, 23 + NotificationsInactivity, 24 + NotificationsInactivityRecurrent, 25 + NotificationsInactivityDoNotDisturb, 26 + NotificationsActivity, 27 + NotificationsActivityRecurrent, 28 + NotificationsActivityDoNotDisturb, 29 + NotificationsBottom, 18 30 }
+3
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsCheckboxAdapterDelegate.kt
··· 29 29 checkboxItemSettings.isChecked = item.isChecked 30 30 } 31 31 32 + viewItemSettingsDivider.visible = item.dividerIsVisible 33 + 32 34 checkboxItemSettings.setOnClick { onClick(item.block) } 33 35 } 34 36 } ··· 38 40 val title: String, 39 41 val subtitle: String, 40 42 val isChecked: Boolean, 43 + val dividerIsVisible: Boolean = true, 41 44 ) : ViewHolderType { 42 45 43 46 override fun getUniqueId(): Long = block.ordinal.toLong()
+38
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsCollapseAdapterDelegate.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.rotateDown 6 + import com.example.util.simpletimetracker.feature_views.extension.rotateUp 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.SettingsCollapseViewData as ViewData 10 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsCollapseBinding as Binding 11 + 12 + fun createSettingsCollapseAdapterDelegate( 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 + tvItemSettingsCollapseTitle.text = item.title 22 + viewItemSettingsDivider.visible = item.dividerIsVisible 23 + arrowItemSettingsCollapse.apply { if (item.opened) rotateDown() else rotateUp() } 24 + layoutItemSettingsCollapseTitle.setOnClick { onClick(item.block) } 25 + } 26 + } 27 + 28 + data class SettingsCollapseViewData( 29 + val block: SettingsBlock, 30 + val title: String, 31 + val opened: Boolean, 32 + val dividerIsVisible: Boolean = true, 33 + ) : ViewHolderType { 34 + 35 + override fun getUniqueId(): Long = block.ordinal.toLong() 36 + 37 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 38 + }
+42
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsRangeAdapterDelegate.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.SettingsRangeViewData as ViewData 8 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsRangeBinding as Binding 9 + 10 + fun createSettingsRangeAdapterDelegate( 11 + onStartClick: (SettingsBlock) -> Unit, 12 + onEndClick: (SettingsBlock) -> Unit, 13 + ) = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 14 + Binding::inflate, 15 + ) { binding, item, _ -> 16 + 17 + with(binding) { 18 + item as ViewData 19 + 20 + tvItemSettingsTitle.text = item.title 21 + tvItemSettingsStart.text = item.start 22 + tvItemSettingsEnd.text = item.end 23 + 24 + viewItemSettingsDivider.visible = item.dividerIsVisible 25 + 26 + tvItemSettingsStart.setOnClick { onStartClick(item.block) } 27 + tvItemSettingsEnd.setOnClick { onEndClick(item.block) } 28 + } 29 + } 30 + 31 + data class SettingsRangeViewData( 32 + val block: SettingsBlock, 33 + val title: String, 34 + val start: String, 35 + val end: String, 36 + val dividerIsVisible: Boolean = true, 37 + ) : ViewHolderType { 38 + 39 + override fun getUniqueId(): Long = block.ordinal.toLong() 40 + 41 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 42 + }
+50
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsSelectorAdapterDelegate.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.SettingsSelectorViewData as ViewData 8 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsSelectorBinding as Binding 9 + 10 + fun createSettingsSelectorAdapterDelegate( 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 + tvItemSettingsSelectorValue.text = item.selectedValue 29 + 30 + spaceItemSettingsBottom.visible = item.bottomSpaceIsVisible 31 + 32 + viewItemSettingsDivider.visible = item.dividerIsVisible 33 + 34 + groupItemSettingsSelector.setOnClick { onClick(item.block) } 35 + } 36 + } 37 + 38 + data class SettingsSelectorViewData( 39 + val block: SettingsBlock, 40 + val title: String, 41 + val subtitle: String, 42 + val selectedValue: String, 43 + val bottomSpaceIsVisible: Boolean = true, 44 + val dividerIsVisible: Boolean = true, 45 + ) : ViewHolderType { 46 + 47 + override fun getUniqueId(): Long = block.ordinal.toLong() 48 + 49 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 50 + }
+150
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsNotificationsViewDataInteractor.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.interactor 2 + 3 + import com.example.util.simpletimetracker.core.repo.ResourceRepo 4 + import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 5 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 6 + import com.example.util.simpletimetracker.feature_settings.R 7 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBlock 8 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBottomViewData 9 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsCheckboxViewData 10 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsCollapseViewData 11 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsRangeViewData 12 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSelectorViewData 13 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTopViewData 14 + import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 15 + import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 16 + import javax.inject.Inject 17 + 18 + class SettingsNotificationsViewDataInteractor @Inject constructor( 19 + private val resourceRepo: ResourceRepo, 20 + private val settingsMapper: SettingsMapper, 21 + private val prefsInteractor: PrefsInteractor, 22 + ) { 23 + 24 + suspend fun execute( 25 + isCollapsed: Boolean, 26 + ): List<ViewHolderType> { 27 + val result = mutableListOf<ViewHolderType>() 28 + 29 + result += SettingsTopViewData( 30 + block = SettingsBlock.NotificationsTop, 31 + ) 32 + 33 + result += SettingsCollapseViewData( 34 + block = SettingsBlock.NotificationsCollapse, 35 + title = resourceRepo.getString(R.string.settings_notification_title), 36 + opened = !isCollapsed, 37 + dividerIsVisible = !isCollapsed, 38 + ) 39 + 40 + if (!isCollapsed) { 41 + val showNotifications = prefsInteractor.getShowNotifications() 42 + result += SettingsCheckboxViewData( 43 + block = SettingsBlock.NotificationsShow, 44 + title = resourceRepo.getString(R.string.settings_show_notifications), 45 + subtitle = resourceRepo.getString(R.string.settings_show_notifications_hint), 46 + isChecked = showNotifications, 47 + dividerIsVisible = !showNotifications, 48 + ) 49 + if (showNotifications) { 50 + result += SettingsCheckboxViewData( 51 + block = SettingsBlock.NotificationsShowControls, 52 + title = resourceRepo.getString(R.string.settings_show_notifications_controls), 53 + subtitle = "", 54 + isChecked = prefsInteractor.getShowNotificationsControls(), 55 + ) 56 + } 57 + 58 + val inactivityViewData = loadInactivityReminderViewData() 59 + result += SettingsSelectorViewData( 60 + block = SettingsBlock.NotificationsInactivity, 61 + title = resourceRepo.getString(R.string.settings_inactivity_reminder), 62 + subtitle = resourceRepo.getString(R.string.settings_inactivity_reminder_hint), 63 + selectedValue = inactivityViewData.text, 64 + bottomSpaceIsVisible = !inactivityViewData.enabled, 65 + dividerIsVisible = !inactivityViewData.enabled, 66 + ) 67 + if (inactivityViewData.enabled) { 68 + result += SettingsCheckboxViewData( 69 + block = SettingsBlock.NotificationsInactivityRecurrent, 70 + title = resourceRepo.getString(R.string.settings_inactivity_reminder_recurrent), 71 + subtitle = "", 72 + isChecked = prefsInteractor.getInactivityReminderRecurrent(), 73 + dividerIsVisible = false, 74 + ) 75 + result += SettingsRangeViewData( 76 + block = SettingsBlock.NotificationsInactivityDoNotDisturb, 77 + title = resourceRepo.getString(R.string.settings_do_not_disturb), 78 + start = loadInactivityReminderDndStartViewData(), 79 + end = loadInactivityReminderDndEndViewData(), 80 + ) 81 + } 82 + 83 + val activityViewData = loadActivityReminderViewData() 84 + result += SettingsSelectorViewData( 85 + block = SettingsBlock.NotificationsActivity, 86 + title = resourceRepo.getString(R.string.settings_activity_reminder), 87 + subtitle = resourceRepo.getString(R.string.settings_activity_reminder_hint), 88 + selectedValue = activityViewData.text, 89 + bottomSpaceIsVisible = !activityViewData.enabled, 90 + dividerIsVisible = false, 91 + ) 92 + if (activityViewData.enabled) { 93 + result += SettingsCheckboxViewData( 94 + block = SettingsBlock.NotificationsActivityRecurrent, 95 + title = resourceRepo.getString(R.string.settings_inactivity_reminder_recurrent), 96 + subtitle = "", 97 + isChecked = prefsInteractor.getActivityReminderRecurrent(), 98 + dividerIsVisible = false, 99 + ) 100 + result += SettingsRangeViewData( 101 + block = SettingsBlock.NotificationsActivityDoNotDisturb, 102 + title = resourceRepo.getString(R.string.settings_do_not_disturb), 103 + start = loadActivityReminderDndStartViewData(), 104 + end = loadActivityReminderDndEndViewData(), 105 + dividerIsVisible = false, 106 + ) 107 + } 108 + } 109 + 110 + result += SettingsBottomViewData( 111 + block = SettingsBlock.NotificationsBottom, 112 + ) 113 + 114 + return result 115 + } 116 + 117 + private suspend fun loadInactivityReminderViewData(): SettingsDurationViewData { 118 + return prefsInteractor.getInactivityReminderDuration() 119 + .let(settingsMapper::toDurationViewData) 120 + } 121 + 122 + private suspend fun loadInactivityReminderDndStartViewData(): String { 123 + val shift = prefsInteractor.getInactivityReminderDoNotDisturbStart() 124 + val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 125 + return settingsMapper.toStartOfDayText(shift, useMilitaryTime) 126 + } 127 + 128 + private suspend fun loadInactivityReminderDndEndViewData(): String { 129 + val shift = prefsInteractor.getInactivityReminderDoNotDisturbEnd() 130 + val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 131 + return settingsMapper.toStartOfDayText(shift, useMilitaryTime) 132 + } 133 + 134 + private suspend fun loadActivityReminderViewData(): SettingsDurationViewData { 135 + return prefsInteractor.getActivityReminderDuration() 136 + .let(settingsMapper::toDurationViewData) 137 + } 138 + 139 + private suspend fun loadActivityReminderDndStartViewData(): String { 140 + val shift = prefsInteractor.getActivityReminderDoNotDisturbStart() 141 + val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 142 + return settingsMapper.toStartOfDayText(shift, useMilitaryTime) 143 + } 144 + 145 + private suspend fun loadActivityReminderDndEndViewData(): String { 146 + val shift = prefsInteractor.getActivityReminderDoNotDisturbEnd() 147 + val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 148 + return settingsMapper.toStartOfDayText(shift, useMilitaryTime) 149 + } 150 + }
+6 -65
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 3 3 import android.view.LayoutInflater 4 4 import android.view.ViewGroup 5 5 import android.view.WindowManager 6 - import androidx.core.view.isVisible 7 6 import androidx.fragment.app.activityViewModels 8 7 import androidx.fragment.app.viewModels 9 8 import com.example.util.simpletimetracker.core.base.BaseFragment ··· 17 16 import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter 18 17 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsBottomAdapterDelegate 19 18 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsCheckboxAdapterDelegate 19 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsCollapseAdapterDelegate 20 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsRangeAdapterDelegate 21 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsSelectorAdapterDelegate 20 22 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsSpinnerAdapterDelegate 21 23 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsSpinnerNotCheckableAdapterDelegate 22 24 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsTextAdapterDelegate ··· 26 28 import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 27 29 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 28 30 import com.example.util.simpletimetracker.feature_settings.viewData.RepeatButtonViewData 29 - import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 30 31 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsStartOfDayViewData 31 32 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsUntrackedRangeViewData 32 33 import com.example.util.simpletimetracker.feature_settings.viewData.WidgetTransparencyViewData ··· 74 75 createSettingsCheckboxAdapterDelegate(viewModel::onCheckboxClicked), 75 76 createSettingsSpinnerAdapterDelegate(viewModel::onSpinnerPositionSelected), 76 77 createSettingsSpinnerNotCheckableAdapterDelegate(viewModel::onSpinnerPositionSelected), 78 + createSettingsCollapseAdapterDelegate(viewModel::onCollapseClicked), 79 + createSettingsSelectorAdapterDelegate(viewModel::onSelectorClicked), 80 + createSettingsRangeAdapterDelegate(viewModel::onRangeStartClicked, viewModel::onRangeEndClicked) 77 81 ) 78 82 } 79 83 ··· 88 92 } 89 93 90 94 override fun initUx() = with(binding) { 91 - with(layoutSettingsNotifications) { 92 - with(viewModel.notificationsDelegate) { 93 - layoutSettingsNotificationsTitle.setOnClick(viewModel::onSettingsNotificationsClick) 94 - checkboxSettingsShowNotifications.setOnClick(::onShowNotificationsClicked) 95 - checkboxSettingsShowNotificationsControls.setOnClick(::onShowNotificationsControlsClicked) 96 - groupSettingsInactivityReminder.setOnClick(::onInactivityReminderClicked) 97 - checkboxSettingsInactivityReminderRecurrent.setOnClick(::onInactivityReminderRecurrentClicked) 98 - tvSettingsInactivityReminderDndStart.setOnClick(::onInactivityReminderDoNotDisturbStartClicked) 99 - tvSettingsInactivityReminderDndEnd.setOnClick(::onInactivityReminderDoNotDisturbEndClicked) 100 - groupSettingsActivityReminder.setOnClick(::onActivityReminderClicked) 101 - checkboxSettingsActivityReminderRecurrent.setOnClick(::onActivityReminderRecurrentClicked) 102 - tvSettingsActivityReminderDndStart.setOnClick(::onActivityReminderDoNotDisturbStartClicked) 103 - tvSettingsActivityReminderDndEnd.setOnClick(::onActivityReminderDoNotDisturbEndClicked) 104 - } 105 - } 106 - 107 95 with(layoutSettingsDisplay) { 108 96 with(viewModel.displayDelegate) { 109 97 layoutSettingsDisplayTitle.setOnClick(viewModel::onSettingsDisplayClick) ··· 168 156 with(viewModel) { 169 157 content.observe(contentAdapter::replace) 170 158 171 - settingsNotificationsVisibility.observe { opened -> 172 - layoutSettingsNotifications.layoutSettingsNotificationsContent.visible = opened 173 - layoutSettingsNotifications.arrowSettingsNotifications 174 - .apply { if (opened) rotateDown() else rotateUp() } 175 - } 176 159 viewModel.settingsDisplayVisibility.observe { opened -> 177 160 layoutSettingsDisplay.layoutSettingsDisplayContent.visible = opened 178 161 layoutSettingsDisplay.arrowSettingsDisplay ··· 201 184 202 185 with(viewModel.mainDelegate) { 203 186 themeChanged.observe(::changeTheme) 204 - } 205 - 206 - with(viewModel.notificationsDelegate) { 207 - with(layoutSettingsNotifications) { 208 - showNotificationsCheckbox.observe(::updateShowNotifications) 209 - showNotificationsControlsCheckbox.observe(checkboxSettingsShowNotificationsControls::setChecked) 210 - inactivityReminderViewData.observe(::updateInactivityReminder) 211 - inactivityReminderRecurrentCheckbox.observe(checkboxSettingsInactivityReminderRecurrent::setChecked) 212 - inactivityReminderDndStartViewData.observe(tvSettingsInactivityReminderDndStart::setText) 213 - inactivityReminderDndEndViewData.observe(tvSettingsInactivityReminderDndEnd::setText) 214 - activityReminderViewData.observe(::updateActivityReminder) 215 - activityReminderRecurrentCheckbox.observe(checkboxSettingsActivityReminderRecurrent::setChecked) 216 - activityReminderDndStartViewData.observe(tvSettingsActivityReminderDndStart::setText) 217 - activityReminderDndEndViewData.observe(tvSettingsActivityReminderDndEnd::setText) 218 - } 219 187 } 220 188 221 189 with(viewModel.displayDelegate) { ··· 285 253 286 254 override fun onResume() = with(binding) { 287 255 super.onResume() 288 - with(layoutSettingsNotifications) { 289 - checkboxSettingsShowNotifications.jumpDrawablesToCurrentState() 290 - checkboxSettingsShowNotificationsControls.jumpDrawablesToCurrentState() 291 - checkboxSettingsInactivityReminderRecurrent.jumpDrawablesToCurrentState() 292 - checkboxSettingsActivityReminderRecurrent.jumpDrawablesToCurrentState() 293 - } 294 256 with(layoutSettingsDisplay) { 295 257 spinnerSettingsDaysInCalendar.jumpDrawablesToCurrentState() 296 258 spinnerSettingsWidgetTransparency.jumpDrawablesToCurrentState() ··· 391 353 ) = with(binding.layoutSettingsAdditional) { 392 354 checkboxSettingsShowRecordTagSelection.isChecked = isChecked 393 355 groupSettingsRecordTagSelectionClose.visible = isChecked 394 - } 395 - 396 - private fun updateShowNotifications( 397 - isChecked: Boolean, 398 - ) = with(binding.layoutSettingsNotifications) { 399 - checkboxSettingsShowNotifications.isChecked = isChecked 400 - groupSettingsShowNotifications.visible = isChecked 401 - } 402 - 403 - private fun updateInactivityReminder( 404 - data: SettingsDurationViewData, 405 - ) = with(binding.layoutSettingsNotifications) { 406 - tvSettingsInactivityReminderTime.text = data.text 407 - groupSettingsInactivityReminderRecurrent.isVisible = data.enabled 408 - } 409 - 410 - private fun updateActivityReminder( 411 - data: SettingsDurationViewData, 412 - ) = with(binding.layoutSettingsNotifications) { 413 - tvSettingsActivityReminderTime.text = data.text 414 - groupSettingsActivityReminderRecurrent.isVisible = data.enabled 415 356 } 416 357 417 358 private fun updateShowRecordCalendarChecked(
+61 -16
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt
··· 12 12 import com.example.util.simpletimetracker.domain.extension.orFalse 13 13 import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 14 14 import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBlock 15 - import com.example.util.simpletimetracker.feature_settings.interactor.SettingsMainViewDataInteractor 16 - import com.example.util.simpletimetracker.feature_settings.interactor.SettingsRatingViewDataInteractor 17 15 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 18 16 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsAdditionalViewModelDelegate 19 17 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsDisplayViewModelDelegate ··· 32 30 @HiltViewModel 33 31 class SettingsViewModel @Inject constructor( 34 32 val mainDelegate: SettingsMainViewModelDelegate, 35 - val notificationsDelegate: SettingsNotificationsViewModelDelegate, 36 33 val displayDelegate: SettingsDisplayViewModelDelegate, 37 34 val additionalDelegate: SettingsAdditionalViewModelDelegate, 38 - val ratingDelegate: SettingsRatingViewModelDelegate, 39 35 val translatorsDelegate: SettingsTranslatorsViewModelDelegate, 40 36 private val router: Router, 41 37 private val settingsMapper: SettingsMapper, 42 - private val settingsMainViewDataInteractor: SettingsMainViewDataInteractor, 43 - private val settingsRatingViewDataInteractor: SettingsRatingViewDataInteractor, 38 + private val ratingDelegate: SettingsRatingViewModelDelegate, 39 + private val notificationsDelegate: SettingsNotificationsViewModelDelegate, 44 40 ) : BaseViewModel(), SettingsParent { 45 41 46 42 val content: LiveData<List<ViewHolderType>> by lazySuspend { loadContent() } 47 - val settingsNotificationsVisibility: LiveData<Boolean> = MutableLiveData(false) 48 43 val settingsDisplayVisibility: LiveData<Boolean> = MutableLiveData(false) 49 44 val settingsAdditionalVisibility: LiveData<Boolean> = MutableLiveData(false) 50 45 val settingsBackupVisibility: LiveData<Boolean> = MutableLiveData(false) ··· 70 65 71 66 override suspend fun onUseMilitaryTimeClicked() { 72 67 additionalDelegate.onUseMilitaryTimeClicked() 73 - notificationsDelegate.onUseMilitaryTimeClicked() 74 68 } 75 69 76 70 fun onVisible() { ··· 79 73 // Update can come from quick settings widget. 80 74 // Update can come from system settings. 81 75 viewModelScope.launch { updateContent() } 76 + } 77 + 78 + fun onCollapseClicked(block: SettingsBlock) { 79 + when (block) { 80 + SettingsBlock.NotificationsCollapse -> 81 + notificationsDelegate.onCollapseClick() 82 + else -> { 83 + // Do nothing 84 + } 85 + } 86 + } 87 + 88 + fun onSelectorClicked(block: SettingsBlock) { 89 + when (block) { 90 + SettingsBlock.NotificationsInactivity -> 91 + notificationsDelegate.onInactivityReminderClicked() 92 + SettingsBlock.NotificationsActivity -> 93 + notificationsDelegate.onActivityReminderClicked() 94 + else -> { 95 + // Do nothing 96 + } 97 + } 98 + } 99 + 100 + fun onRangeStartClicked(block: SettingsBlock) { 101 + when (block) { 102 + SettingsBlock.NotificationsInactivityDoNotDisturb -> 103 + notificationsDelegate.onInactivityReminderDoNotDisturbStartClicked() 104 + SettingsBlock.NotificationsActivityDoNotDisturb -> 105 + notificationsDelegate.onActivityReminderDoNotDisturbStartClicked() 106 + else -> { 107 + // Do nothing 108 + } 109 + } 110 + } 111 + 112 + fun onRangeEndClicked(block: SettingsBlock) { 113 + when (block) { 114 + SettingsBlock.NotificationsInactivityDoNotDisturb -> 115 + notificationsDelegate.onInactivityReminderDoNotDisturbEndClicked() 116 + SettingsBlock.NotificationsActivityDoNotDisturb -> 117 + notificationsDelegate.onActivityReminderDoNotDisturbEndClicked() 118 + else -> { 119 + // Do nothing 120 + } 121 + } 82 122 } 83 123 84 124 fun onTextClicked(block: SettingsBlock) { ··· 96 136 97 137 fun onCheckboxClicked(block: SettingsBlock) { 98 138 when (block) { 99 - SettingsBlock.AllowMultitasking -> mainDelegate.onAllowMultitaskingClicked() 139 + SettingsBlock.AllowMultitasking -> 140 + mainDelegate.onAllowMultitaskingClicked() 141 + SettingsBlock.NotificationsShow -> 142 + notificationsDelegate.onShowNotificationsClicked() 143 + SettingsBlock.NotificationsShowControls -> 144 + notificationsDelegate.onShowNotificationsControlsClicked() 145 + SettingsBlock.NotificationsInactivityRecurrent -> 146 + notificationsDelegate.onInactivityReminderRecurrentClicked() 147 + SettingsBlock.NotificationsActivityRecurrent -> 148 + notificationsDelegate.onActivityReminderRecurrentClicked() 100 149 else -> { 101 150 // Do nothing 102 151 } ··· 111 160 // Do nothing 112 161 } 113 162 } 114 - } 115 - 116 - fun onSettingsNotificationsClick() { 117 - val newValue = settingsNotificationsVisibility.value?.flip().orFalse() 118 - settingsNotificationsVisibility.set(newValue) 119 163 } 120 164 121 165 fun onSettingsDisplayClick() { ··· 202 246 203 247 private suspend fun loadContent(): List<ViewHolderType> { 204 248 val result = mutableListOf<ViewHolderType>() 205 - result += settingsMainViewDataInteractor.execute() 206 - result += settingsRatingViewDataInteractor.execute() 249 + result += mainDelegate.getViewData() 250 + result += ratingDelegate.getViewData() 251 + result += notificationsDelegate.getViewData() 207 252 return result 208 253 } 209 254
+1
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsDisplayViewModelDelegate.kt
··· 223 223 updateUseMilitaryTimeViewData() 224 224 updateUntrackedRangeViewData() 225 225 parent?.onUseMilitaryTimeClicked() 226 + parent?.updateContent() 226 227 } 227 228 } 228 229
+7
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsMainViewModelDelegate.kt
··· 7 7 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 8 8 import com.example.util.simpletimetracker.domain.interactor.WidgetInteractor 9 9 import com.example.util.simpletimetracker.domain.model.WidgetType 10 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 11 + import com.example.util.simpletimetracker.feature_settings.interactor.SettingsMainViewDataInteractor 10 12 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 11 13 import com.example.util.simpletimetracker.navigation.Router 12 14 import com.example.util.simpletimetracker.navigation.params.screen.ArchiveParams ··· 21 23 private val languageInteractor: LanguageInteractor, 22 24 private val settingsMapper: SettingsMapper, 23 25 private val widgetInteractor: WidgetInteractor, 26 + private val settingsMainViewDataInteractor: SettingsMainViewDataInteractor, 24 27 ) : ViewModelDelegate() { 25 28 26 29 val themeChanged: SingleLiveEvent<Boolean> = SingleLiveEvent() ··· 29 32 30 33 fun init(parent: SettingsParent) { 31 34 this.parent = parent 35 + } 36 + 37 + suspend fun getViewData(): List<ViewHolderType> { 38 + return settingsMainViewDataInteractor.execute() 32 39 } 33 40 34 41 fun onEditCategoriesClick() {
+26 -105
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsNotificationsViewModelDelegate.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.ViewModelDelegate 5 - import com.example.util.simpletimetracker.core.extension.lazySuspend 6 - import com.example.util.simpletimetracker.core.extension.set 7 4 import com.example.util.simpletimetracker.core.interactor.CheckExactAlarmPermissionInteractor 8 5 import com.example.util.simpletimetracker.core.interactor.CheckNotificationsPermissionInteractor 6 + import com.example.util.simpletimetracker.domain.extension.flip 9 7 import com.example.util.simpletimetracker.domain.interactor.NotificationActivityInteractor 10 8 import com.example.util.simpletimetracker.domain.interactor.NotificationInactivityInteractor 11 9 import com.example.util.simpletimetracker.domain.interactor.NotificationTypeInteractor 12 10 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 11 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 12 + import com.example.util.simpletimetracker.feature_settings.interactor.SettingsNotificationsViewDataInteractor 13 13 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 14 - import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 15 14 import com.example.util.simpletimetracker.feature_settings.viewModel.SettingsViewModel 16 15 import com.example.util.simpletimetracker.navigation.Router 17 16 import com.example.util.simpletimetracker.navigation.params.screen.DurationDialogParams ··· 27 26 private val notificationActivityInteractor: NotificationActivityInteractor, 28 27 private val checkExactAlarmPermissionInteractor: CheckExactAlarmPermissionInteractor, 29 28 private val checkNotificationsPermissionInteractor: CheckNotificationsPermissionInteractor, 29 + private val settingsNotificationsViewDataInteractor: SettingsNotificationsViewDataInteractor, 30 30 ) : ViewModelDelegate() { 31 31 32 - val showNotificationsCheckbox: LiveData<Boolean> 33 - by lazySuspend { prefsInteractor.getShowNotifications() } 34 - val showNotificationsControlsCheckbox: LiveData<Boolean> 35 - by lazySuspend { prefsInteractor.getShowNotificationsControls() } 36 - val inactivityReminderViewData: LiveData<SettingsDurationViewData> 37 - by lazySuspend { loadInactivityReminderViewData() } 38 - val inactivityReminderRecurrentCheckbox: LiveData<Boolean> 39 - by lazySuspend { prefsInteractor.getInactivityReminderRecurrent() } 40 - val inactivityReminderDndStartViewData: LiveData<String> 41 - by lazySuspend { loadInactivityReminderDndStartViewData() } 42 - val inactivityReminderDndEndViewData: LiveData<String> 43 - by lazySuspend { loadInactivityReminderDndEndViewData() } 44 - val activityReminderViewData: LiveData<SettingsDurationViewData> 45 - by lazySuspend { loadActivityReminderViewData() } 46 - val activityReminderRecurrentCheckbox: LiveData<Boolean> 47 - by lazySuspend { prefsInteractor.getActivityReminderRecurrent() } 48 - val activityReminderDndStartViewData: LiveData<String> 49 - by lazySuspend { loadActivityReminderDndStartViewData() } 50 - val activityReminderDndEndViewData: LiveData<String> 51 - by lazySuspend { loadActivityReminderDndEndViewData() } 32 + private var isCollapsed: Boolean = true 52 33 53 34 private var parent: SettingsParent? = null 54 35 ··· 56 37 this.parent = parent 57 38 } 58 39 59 - suspend fun onUseMilitaryTimeClicked() { 60 - updateActivityReminderDndStartViewData() 61 - updateActivityReminderDndEndViewData() 62 - updateInactivityReminderDndStartViewData() 63 - updateInactivityReminderDndEndViewData() 40 + suspend fun getViewData(): List<ViewHolderType> { 41 + return settingsNotificationsViewDataInteractor.execute( 42 + isCollapsed = isCollapsed, 43 + ) 44 + } 45 + 46 + fun onCollapseClick() = delegateScope.launch { 47 + isCollapsed = isCollapsed.flip() 48 + parent?.updateContent() 64 49 } 65 50 66 51 fun onShowNotificationsClicked() { 67 52 fun updateValue(newValue: Boolean) = delegateScope.launch { 68 53 prefsInteractor.setShowNotifications(newValue) 69 - showNotificationsCheckbox.set(newValue) 54 + parent?.updateContent() 70 55 notificationTypeInteractor.updateNotifications() 71 56 } 72 57 ··· 86 71 delegateScope.launch { 87 72 val newValue = !prefsInteractor.getShowNotificationsControls() 88 73 prefsInteractor.setShowNotificationsControls(newValue) 89 - showNotificationsControlsCheckbox.set(newValue) 74 + parent?.updateContent() 90 75 notificationTypeInteractor.updateNotifications() 91 76 } 92 77 } ··· 114 99 delegateScope.launch { 115 100 val newValue = !prefsInteractor.getInactivityReminderRecurrent() 116 101 prefsInteractor.setInactivityReminderRecurrent(newValue) 117 - inactivityReminderRecurrentCheckbox.set(newValue) 102 + parent?.updateContent() 118 103 notificationInactivityInteractor.cancel() 119 104 notificationInactivityInteractor.checkAndSchedule() 120 105 } ··· 161 146 delegateScope.launch { 162 147 val newValue = !prefsInteractor.getActivityReminderRecurrent() 163 148 prefsInteractor.setActivityReminderRecurrent(newValue) 164 - activityReminderRecurrentCheckbox.set(newValue) 149 + parent?.updateContent() 165 150 notificationActivityInteractor.cancel() 166 151 notificationActivityInteractor.checkAndSchedule() 167 152 } ··· 191 176 when (tag) { 192 177 SettingsViewModel.INACTIVITY_DURATION_DIALOG_TAG -> delegateScope.launch { 193 178 prefsInteractor.setInactivityReminderDuration(duration) 194 - updateInactivityReminderViewData() 179 + parent?.updateContent() 195 180 notificationInactivityInteractor.cancel() 196 181 notificationInactivityInteractor.checkAndSchedule() 197 182 checkExactAlarmPermissionInteractor.execute() 198 183 } 199 184 SettingsViewModel.ACTIVITY_DURATION_DIALOG_TAG -> delegateScope.launch { 200 185 prefsInteractor.setActivityReminderDuration(duration) 201 - updateActivityReminderViewData() 186 + parent?.updateContent() 202 187 notificationActivityInteractor.cancel() 203 188 notificationActivityInteractor.checkAndSchedule() 204 189 checkExactAlarmPermissionInteractor.execute() ··· 210 195 when (tag) { 211 196 SettingsViewModel.INACTIVITY_DURATION_DIALOG_TAG -> delegateScope.launch { 212 197 prefsInteractor.setInactivityReminderDuration(0) 213 - updateInactivityReminderViewData() 198 + parent?.updateContent() 214 199 notificationInactivityInteractor.cancel() 215 200 } 216 201 217 202 SettingsViewModel.ACTIVITY_DURATION_DIALOG_TAG -> delegateScope.launch { 218 203 prefsInteractor.setActivityReminderDuration(0) 219 - updateActivityReminderViewData() 204 + parent?.updateContent() 220 205 notificationActivityInteractor.cancel() 221 206 } 222 207 } ··· 227 212 SettingsViewModel.INACTIVITY_REMINDER_DND_START_DIALOG_TAG -> { 228 213 val newValue = settingsMapper.toStartOfDayShift(timestamp, wasPositive = true) 229 214 prefsInteractor.setInactivityReminderDoNotDisturbStart(newValue) 230 - updateInactivityReminderDndStartViewData() 215 + parent?.updateContent() 231 216 notificationInactivityInteractor.cancel() 232 217 notificationInactivityInteractor.checkAndSchedule() 233 218 } ··· 235 220 SettingsViewModel.INACTIVITY_REMINDER_DND_END_DIALOG_TAG -> { 236 221 val newValue = settingsMapper.toStartOfDayShift(timestamp, wasPositive = true) 237 222 prefsInteractor.setInactivityReminderDoNotDisturbEnd(newValue) 238 - updateInactivityReminderDndEndViewData() 223 + parent?.updateContent() 239 224 notificationInactivityInteractor.cancel() 240 225 notificationInactivityInteractor.checkAndSchedule() 241 226 } ··· 243 228 SettingsViewModel.ACTIVITY_REMINDER_DND_START_DIALOG_TAG -> { 244 229 val newValue = settingsMapper.toStartOfDayShift(timestamp, wasPositive = true) 245 230 prefsInteractor.setActivityReminderDoNotDisturbStart(newValue) 246 - updateActivityReminderDndStartViewData() 231 + parent?.updateContent() 247 232 notificationActivityInteractor.cancel() 248 233 notificationActivityInteractor.checkAndSchedule() 249 234 } ··· 251 236 SettingsViewModel.ACTIVITY_REMINDER_DND_END_DIALOG_TAG -> { 252 237 val newValue = settingsMapper.toStartOfDayShift(timestamp, wasPositive = true) 253 238 prefsInteractor.setActivityReminderDoNotDisturbEnd(newValue) 254 - updateActivityReminderDndEndViewData() 239 + parent?.updateContent() 255 240 notificationActivityInteractor.cancel() 256 241 notificationActivityInteractor.checkAndSchedule() 257 242 } 258 243 } 259 - } 260 - 261 - private suspend fun updateInactivityReminderViewData() { 262 - val data = loadInactivityReminderViewData() 263 - inactivityReminderViewData.set(data) 264 - } 265 - 266 - private suspend fun loadInactivityReminderViewData(): SettingsDurationViewData { 267 - return prefsInteractor.getInactivityReminderDuration() 268 - .let(settingsMapper::toDurationViewData) 269 - } 270 - 271 - private suspend fun updateInactivityReminderDndStartViewData() { 272 - val data = loadInactivityReminderDndStartViewData() 273 - inactivityReminderDndStartViewData.set(data) 274 - } 275 - 276 - private suspend fun loadInactivityReminderDndStartViewData(): String { 277 - val shift = prefsInteractor.getInactivityReminderDoNotDisturbStart() 278 - val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 279 - return settingsMapper.toStartOfDayText(shift, useMilitaryTime) 280 - } 281 - 282 - private suspend fun updateInactivityReminderDndEndViewData() { 283 - val data = loadInactivityReminderDndEndViewData() 284 - inactivityReminderDndEndViewData.set(data) 285 - } 286 - 287 - private suspend fun loadInactivityReminderDndEndViewData(): String { 288 - val shift = prefsInteractor.getInactivityReminderDoNotDisturbEnd() 289 - val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 290 - return settingsMapper.toStartOfDayText(shift, useMilitaryTime) 291 - } 292 - 293 - private suspend fun updateActivityReminderViewData() { 294 - val data = loadActivityReminderViewData() 295 - activityReminderViewData.set(data) 296 - } 297 - 298 - private suspend fun loadActivityReminderViewData(): SettingsDurationViewData { 299 - return prefsInteractor.getActivityReminderDuration() 300 - .let(settingsMapper::toDurationViewData) 301 - } 302 - 303 - private suspend fun updateActivityReminderDndStartViewData() { 304 - val data = loadActivityReminderDndStartViewData() 305 - activityReminderDndStartViewData.set(data) 306 - } 307 - 308 - private suspend fun loadActivityReminderDndStartViewData(): String { 309 - val shift = prefsInteractor.getActivityReminderDoNotDisturbStart() 310 - val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 311 - return settingsMapper.toStartOfDayText(shift, useMilitaryTime) 312 - } 313 - 314 - private suspend fun updateActivityReminderDndEndViewData() { 315 - val data = loadActivityReminderDndEndViewData() 316 - activityReminderDndEndViewData.set(data) 317 - } 318 - 319 - private suspend fun loadActivityReminderDndEndViewData(): String { 320 - val shift = prefsInteractor.getActivityReminderDoNotDisturbEnd() 321 - val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 322 - return settingsMapper.toStartOfDayText(shift, useMilitaryTime) 323 244 } 324 245 }
+7
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsRatingViewModelDelegate.kt
··· 3 3 import com.example.util.simpletimetracker.core.base.ViewModelDelegate 4 4 import com.example.util.simpletimetracker.core.provider.ApplicationDataProvider 5 5 import com.example.util.simpletimetracker.core.repo.ResourceRepo 6 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 6 7 import com.example.util.simpletimetracker.feature_settings.R 8 + import com.example.util.simpletimetracker.feature_settings.interactor.SettingsRatingViewDataInteractor 7 9 import com.example.util.simpletimetracker.navigation.Router 8 10 import com.example.util.simpletimetracker.navigation.params.action.OpenMarketParams 9 11 import com.example.util.simpletimetracker.navigation.params.action.SendEmailParams ··· 14 16 private val router: Router, 15 17 private val resourceRepo: ResourceRepo, 16 18 private val applicationDataProvider: ApplicationDataProvider, 19 + private val settingsRatingViewDataInteractor: SettingsRatingViewDataInteractor, 17 20 ) : ViewModelDelegate() { 21 + 22 + fun getViewData(): List<ViewHolderType> { 23 + return settingsRatingViewDataInteractor.execute() 24 + } 18 25 19 26 fun onRateClick() { 20 27 router.execute(