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.

refactor after changing settings to recycler

razeeman (Jan 20, 2024, 4:18 PM +0300) 772e9284 aea9fd7f

+76 -144
+8 -23
features/feature_settings/src/main/res/layout/settings_fragment.xml
··· 1 1 <?xml version="1.0" encoding="utf-8"?> 2 - <androidx.core.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" 2 + <androidx.recyclerview.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 3 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 4 xmlns:tools="http://schemas.android.com/tools" 5 - android:id="@+id/containerSettings" 5 + android:id="@+id/rvSettingsContent" 6 6 android:layout_width="match_parent" 7 - android:layout_height="match_parent"> 8 - 9 - <LinearLayout 10 - android:layout_width="match_parent" 11 - android:layout_height="wrap_content" 12 - android:orientation="vertical" 13 - android:paddingStart="8dp" 14 - android:paddingEnd="8dp"> 15 - 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" /> 24 - 25 - </LinearLayout> 26 - 27 - </androidx.core.widget.NestedScrollView> 7 + android:layout_height="wrap_content" 8 + android:paddingStart="8dp" 9 + android:paddingEnd="8dp" 10 + app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" 11 + tools:itemCount="3" 12 + tools:listitem="@layout/item_settings_text" />
+8 -3
core/src/main/java/com/example/util/simpletimetracker/core/viewData/SettingsBlock.kt
··· 22 22 NotificationsShowControls, 23 23 NotificationsInactivity, 24 24 NotificationsInactivityRecurrent, 25 - NotificationsInactivityDoNotDisturb, 25 + NotificationsInactivityDoNotDisturbStart, 26 + NotificationsInactivityDoNotDisturbEnd, 26 27 NotificationsActivity, 27 28 NotificationsActivityRecurrent, 28 - NotificationsActivityDoNotDisturb, 29 + NotificationsActivityDoNotDisturbStart, 30 + NotificationsActivityDoNotDisturbEnd, 29 31 NotificationsBottom, 30 32 31 33 DisplayTop, ··· 34 36 DisplayUntrackedInRecords, 35 37 DisplayUntrackedInStatistics, 36 38 DisplayUntrackedIgnoreShort, 37 - DisplayUntrackedRange, 39 + DisplayUntrackedRangeCheckbox, 40 + DisplayUntrackedRangeStart, 41 + DisplayUntrackedRangeEnd, 38 42 DisplayCalendarView, 39 43 DisplayReverseOrder, 40 44 DisplayDaysInCalendar, ··· 60 64 AdditionalFirstDayOfWeek, 61 65 AdditionalRepeatButton, 62 66 AdditionalShiftStartOfDay, 67 + AdditionalShiftStartOfDayButton, 63 68 AdditionalShiftStartOfDayHint, 64 69 AdditionalAutomatedTracking, 65 70 AdditionalSendEvents,
+7 -7
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsCheckboxWithRangeAdapterDelegate.kt
··· 11 11 12 12 fun createSettingsCheckboxWithRangeAdapterDelegate( 13 13 onClick: (SettingsBlock) -> Unit, 14 - onStartClick: (SettingsBlock) -> Unit, 15 - onEndClick: (SettingsBlock) -> Unit, 16 14 ) = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 17 15 Binding::inflate, 18 16 ) { binding, item, _ -> ··· 36 34 tvItemSettingsCheckboxWithRangeEnd.text = item.range.rangeEnd 37 35 } 38 36 39 - checkboxItemSettingsCheckboxWithRange.setOnClick { onClick(item.block) } 40 - tvItemSettingsCheckboxWithRangeStart.setOnClick { onStartClick(item.block) } 41 - tvItemSettingsCheckboxWithRangeEnd.setOnClick { onEndClick(item.block) } 37 + checkboxItemSettingsCheckboxWithRange.setOnClick { onClick(item.blockCheckbox) } 38 + tvItemSettingsCheckboxWithRangeStart.setOnClick { onClick(item.blockStart) } 39 + tvItemSettingsCheckboxWithRangeEnd.setOnClick { onClick(item.blockEnd) } 42 40 } 43 41 } 44 42 45 43 data class SettingsCheckboxWithRangeViewData( 46 - val block: SettingsBlock, 44 + val blockCheckbox: SettingsBlock, 45 + val blockStart: SettingsBlock, 46 + val blockEnd: SettingsBlock, 47 47 val title: String, 48 48 val subtitle: String, 49 49 val isChecked: Boolean, 50 50 val range: RangeViewData, 51 51 ) : ViewHolderType { 52 52 53 - override fun getUniqueId(): Long = block.ordinal.toLong() 53 + override fun getUniqueId(): Long = blockCheckbox.ordinal.toLong() 54 54 55 55 override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 56 56
+6 -6
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsRangeAdapterDelegate.kt
··· 9 9 import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsRangeBinding as Binding 10 10 11 11 fun createSettingsRangeAdapterDelegate( 12 - onStartClick: (SettingsBlock) -> Unit, 13 - onEndClick: (SettingsBlock) -> Unit, 12 + onClick: (SettingsBlock) -> Unit, 14 13 ) = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 15 14 Binding::inflate, 16 15 ) { binding, item, _ -> ··· 24 23 25 24 viewItemSettingsDivider.visible = item.dividerIsVisible 26 25 27 - tvItemSettingsStart.setOnClick { onStartClick(item.block) } 28 - tvItemSettingsEnd.setOnClick { onEndClick(item.block) } 26 + tvItemSettingsStart.setOnClick { onClick(item.blockStart) } 27 + tvItemSettingsEnd.setOnClick { onClick(item.blockEnd) } 29 28 } 30 29 } 31 30 32 31 data class SettingsRangeViewData( 33 - val block: SettingsBlock, 32 + val blockStart: SettingsBlock, 33 + val blockEnd: SettingsBlock, 34 34 val title: String, 35 35 val start: String, 36 36 val end: String, 37 37 val dividerIsVisible: Boolean = true, 38 38 ) : ViewHolderType { 39 39 40 - override fun getUniqueId(): Long = block.ordinal.toLong() 40 + override fun getUniqueId(): Long = blockStart.ordinal.toLong() 41 41 42 42 override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 43 43 }
+2 -2
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsSelectorWithButtonAdapterDelegate.kt
··· 10 10 11 11 fun createSettingsSelectorWithButtonAdapterDelegate( 12 12 onClick: (SettingsBlock) -> Unit, 13 - onButtonClick: (SettingsBlock) -> Unit, 14 13 ) = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 15 14 Binding::inflate, 16 15 ) { binding, item, _ -> ··· 31 30 32 31 btnItemSettingsSelector.visible = item.isButtonVisible 33 32 tvItemSettingsSelectorButton.text = item.buttonText 34 - btnItemSettingsSelector.setOnClick { onButtonClick(item.data.block) } 33 + btnItemSettingsSelector.setOnClick { onClick(item.buttonBlock) } 35 34 } 36 35 } 37 36 38 37 data class SettingsSelectorWithButtonViewData( 39 38 val data: SettingsSelectorViewData, 39 + val buttonBlock: SettingsBlock, 40 40 val isButtonVisible: Boolean, 41 41 val buttonText: String, 42 42 ) : ViewHolderType {
+1
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsAdditionalViewDataInteractor.kt
··· 127 127 bottomSpaceIsVisible = false, 128 128 dividerIsVisible = false, 129 129 ), 130 + buttonBlock = SettingsBlock.AdditionalShiftStartOfDayButton, 130 131 isButtonVisible = startOfDayViewData.startOfDaySign.isNotEmpty(), 131 132 buttonText = startOfDayViewData.startOfDaySign, 132 133 )
+3 -1
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsDisplayViewDataInteractor.kt
··· 78 78 ) 79 79 val untrackedRangeViewData = loadUntrackedRangeViewData() 80 80 result += SettingsCheckboxWithRangeViewData( 81 - block = SettingsBlock.DisplayUntrackedRange, 81 + blockCheckbox = SettingsBlock.DisplayUntrackedRangeCheckbox, 82 + blockStart = SettingsBlock.DisplayUntrackedRangeStart, 83 + blockEnd = SettingsBlock.DisplayUntrackedRangeEnd, 82 84 title = resourceRepo.getString(R.string.settings_untracked_range), 83 85 subtitle = resourceRepo.getString(R.string.settings_untracked_range_hint), 84 86 isChecked = untrackedRangeViewData is RangeViewData.Enabled,
+4 -2
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsNotificationsViewDataInteractor.kt
··· 75 75 dividerIsVisible = false, 76 76 ) 77 77 result += SettingsRangeViewData( 78 - block = SettingsBlock.NotificationsInactivityDoNotDisturb, 78 + blockStart = SettingsBlock.NotificationsInactivityDoNotDisturbStart, 79 + blockEnd = SettingsBlock.NotificationsInactivityDoNotDisturbEnd, 79 80 title = resourceRepo.getString(R.string.settings_do_not_disturb), 80 81 start = loadInactivityReminderDndStartViewData(), 81 82 end = loadInactivityReminderDndEndViewData(), ··· 101 102 dividerIsVisible = false, 102 103 ) 103 104 result += SettingsRangeViewData( 104 - block = SettingsBlock.NotificationsActivityDoNotDisturb, 105 + blockStart = SettingsBlock.NotificationsActivityDoNotDisturbStart, 106 + blockEnd = SettingsBlock.NotificationsActivityDoNotDisturbEnd, 105 107 title = resourceRepo.getString(R.string.settings_do_not_disturb), 106 108 start = loadActivityReminderDndStartViewData(), 107 109 end = loadActivityReminderDndEndViewData(),
+14 -34
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 13 13 import com.example.util.simpletimetracker.core.dialog.StandardDialogListener 14 14 import com.example.util.simpletimetracker.core.sharedViewModel.BackupViewModel 15 15 import com.example.util.simpletimetracker.core.sharedViewModel.MainTabsViewModel 16 - import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter 17 16 import com.example.util.simpletimetracker.core.viewData.SettingsBlock 17 + import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter 18 18 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsBottomAdapterDelegate 19 19 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsCheckboxAdapterDelegate 20 20 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsCheckboxWithRangeAdapterDelegate ··· 64 64 createSettingsBottomAdapterDelegate(), 65 65 createSettingsTranslatorAdapterDelegate(), 66 66 createSettingsHintAdapterDelegate(), 67 - createSettingsTextAdapterDelegate(throttle(::onTextClicked)), 68 - createSettingsTextWithButtonAdapterDelegate(::onButtonClicked), 69 - createSettingsCheckboxAdapterDelegate(::onCheckboxClicked), 67 + createSettingsTextAdapterDelegate(throttle(::onBlockClicked)), 68 + createSettingsTextWithButtonAdapterDelegate(::onBlockClicked), 69 + createSettingsCheckboxAdapterDelegate(::onBlockClicked), 70 + createSettingsCheckboxWithRangeAdapterDelegate(::onBlockClicked), 71 + createSettingsCollapseAdapterDelegate(::onBlockClicked), 72 + createSettingsSelectorAdapterDelegate(::onBlockClicked), 73 + createSettingsSelectorWithButtonAdapterDelegate(::onBlockClicked), 74 + createSettingsRangeAdapterDelegate(::onBlockClicked), 70 75 createSettingsSpinnerAdapterDelegate(viewModel::onSpinnerPositionSelected), 71 76 createSettingsSpinnerEvenAdapterDelegate(viewModel::onSpinnerPositionSelected), 72 77 createSettingsSpinnerNotCheckableAdapterDelegate(viewModel::onSpinnerPositionSelected), 73 - createSettingsCollapseAdapterDelegate(viewModel::onCollapseClicked), 74 - createSettingsSelectorAdapterDelegate(viewModel::onSelectorClicked), 75 - createSettingsRangeAdapterDelegate( 76 - onStartClick = viewModel::onRangeStartClicked, 77 - onEndClick = viewModel::onRangeEndClicked, 78 - ), 79 78 createSettingsSpinnerWithButtonAdapterDelegate( 80 - viewModel::onSpinnerPositionSelected, 81 - viewModel::onButtonClicked, 82 - ), 83 - createSettingsSelectorWithButtonAdapterDelegate( 84 - viewModel::onSelectorClicked, 85 - viewModel::onButtonClicked, 86 - ), 87 - createSettingsCheckboxWithRangeAdapterDelegate( 88 - onClick = ::onCheckboxClicked, 89 - onStartClick = viewModel::onRangeStartClicked, 90 - onEndClick = viewModel::onRangeEndClicked, 79 + onPositionSelected = viewModel::onSpinnerPositionSelected, 80 + onButtonClicked = ::onBlockClicked, 91 81 ), 92 82 ) 93 83 } ··· 100 90 override fun initViewModel(): Unit = with(binding) { 101 91 viewModel.content.observe(contentAdapter::replaceAsNew) 102 92 viewModel.resetScreen.observe { 103 - containerSettings.smoothScrollTo(0, 0) 93 + rvSettingsContent.smoothScrollToPosition(0) 104 94 mainTabsViewModel.onHandled() 105 95 } 106 96 viewModel.mainDelegate.themeChanged.observe(::changeTheme) ··· 134 124 backupViewModel.onDataExportSettingsSelected(data) 135 125 } 136 126 137 - private fun onTextClicked(block: SettingsBlock) { 138 - viewModel.onTextClicked(block) 139 - backupViewModel.onBlockClicked(block) 140 - } 141 - 142 - private fun onCheckboxClicked(block: SettingsBlock) { 143 - viewModel.onCheckboxClicked(block) 144 - backupViewModel.onBlockClicked(block) 145 - } 146 - 147 - private fun onButtonClicked(block: SettingsBlock) { 148 - viewModel.onButtonClicked(block) 127 + private fun onBlockClicked(block: SettingsBlock) { 128 + viewModel.onBlockClicked(block) 149 129 backupViewModel.onBlockClicked(block) 150 130 } 151 131
+23 -66
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt
··· 76 76 viewModelScope.launch { updateContent() } 77 77 } 78 78 79 - // TODO merge all click functions into one, and move to delegates. 80 - fun onCollapseClicked(block: SettingsBlock) { 79 + fun onBlockClicked(block: SettingsBlock) { 81 80 when (block) { 82 81 SettingsBlock.NotificationsCollapse -> 83 82 notificationsDelegate.onCollapseClick() ··· 89 88 backupDelegate.onCollapseClick() 90 89 SettingsBlock.ExportCollapse -> 91 90 exportDelegate.onCollapseClick() 92 - else -> { 93 - // Do nothing 94 - } 95 - } 96 - } 97 - 98 - fun onSelectorClicked(block: SettingsBlock) { 99 - when (block) { 100 91 SettingsBlock.NotificationsInactivity -> 101 92 notificationsDelegate.onInactivityReminderClicked() 102 93 SettingsBlock.NotificationsActivity -> ··· 107 98 additionalDelegate.onIgnoreShortRecordsClicked() 108 99 SettingsBlock.AdditionalShiftStartOfDay -> 109 100 additionalDelegate.onStartOfDayClicked() 110 - else -> { 111 - // Do nothing 112 - } 113 - } 114 - } 115 - 116 - fun onRangeStartClicked(block: SettingsBlock) { 117 - when (block) { 118 - SettingsBlock.NotificationsInactivityDoNotDisturb -> 101 + SettingsBlock.NotificationsInactivityDoNotDisturbStart -> 119 102 notificationsDelegate.onInactivityReminderDoNotDisturbStartClicked() 120 - SettingsBlock.NotificationsActivityDoNotDisturb -> 121 - notificationsDelegate.onActivityReminderDoNotDisturbStartClicked() 122 - SettingsBlock.DisplayUntrackedRange -> 123 - displayDelegate.onUntrackedRangeStartClicked() 124 - else -> { 125 - // Do nothing 126 - } 127 - } 128 - } 129 - 130 - fun onRangeEndClicked(block: SettingsBlock) { 131 - when (block) { 132 - SettingsBlock.NotificationsInactivityDoNotDisturb -> 103 + SettingsBlock.NotificationsInactivityDoNotDisturbEnd -> 133 104 notificationsDelegate.onInactivityReminderDoNotDisturbEndClicked() 134 - SettingsBlock.NotificationsActivityDoNotDisturb -> 105 + SettingsBlock.NotificationsActivityDoNotDisturbStart -> 106 + notificationsDelegate.onActivityReminderDoNotDisturbStartClicked() 107 + SettingsBlock.NotificationsActivityDoNotDisturbEnd -> 135 108 notificationsDelegate.onActivityReminderDoNotDisturbEndClicked() 136 - SettingsBlock.DisplayUntrackedRange -> 109 + SettingsBlock.DisplayUntrackedRangeStart -> 110 + displayDelegate.onUntrackedRangeStartClicked() 111 + SettingsBlock.DisplayUntrackedRangeEnd -> 137 112 displayDelegate.onUntrackedRangeEndClicked() 138 - else -> { 139 - // Do nothing 140 - } 141 - } 142 - } 143 - 144 - fun onTextClicked(block: SettingsBlock) { 145 - when (block) { 146 - SettingsBlock.Categories -> mainDelegate.onEditCategoriesClick() 147 - SettingsBlock.Archive -> mainDelegate.onArchiveClick() 148 - SettingsBlock.DataEdit -> mainDelegate.onDataEditClick() 149 - SettingsBlock.RateUs -> ratingDelegate.onRateClick() 150 - SettingsBlock.Feedback -> ratingDelegate.onFeedbackClick() 151 - SettingsBlock.DisplayCardSize -> displayDelegate.onChangeCardSizeClick() 152 - else -> { 153 - // Do nothing 154 - } 155 - } 156 - } 157 - 158 - fun onButtonClicked(block: SettingsBlock) { 159 - when (block) { 113 + SettingsBlock.Categories -> 114 + mainDelegate.onEditCategoriesClick() 115 + SettingsBlock.Archive -> 116 + mainDelegate.onArchiveClick() 117 + SettingsBlock.DataEdit -> 118 + mainDelegate.onDataEditClick() 119 + SettingsBlock.RateUs -> 120 + ratingDelegate.onRateClick() 121 + SettingsBlock.Feedback -> 122 + ratingDelegate.onFeedbackClick() 123 + SettingsBlock.DisplayCardSize -> 124 + displayDelegate.onChangeCardSizeClick() 160 125 SettingsBlock.DisplaySortActivities -> 161 126 displayDelegate.onCardOrderManualClick() 162 - SettingsBlock.AdditionalShiftStartOfDay -> 127 + SettingsBlock.AdditionalShiftStartOfDayButton -> 163 128 additionalDelegate.onStartOfDaySignClicked() 164 129 SettingsBlock.AdditionalAutomatedTracking -> 165 130 additionalDelegate.onAutomatedTrackingHelpClick() 166 - else -> { 167 - // Do nothing 168 - } 169 - } 170 - } 171 - 172 - fun onCheckboxClicked(block: SettingsBlock) { 173 - when (block) { 174 131 SettingsBlock.AllowMultitasking -> 175 132 mainDelegate.onAllowMultitaskingClicked() 176 133 SettingsBlock.NotificationsShow -> ··· 185 142 displayDelegate.onShowUntrackedInRecordsClicked() 186 143 SettingsBlock.DisplayUntrackedInStatistics -> 187 144 displayDelegate.onShowUntrackedInStatisticsClicked() 188 - SettingsBlock.DisplayUntrackedRange -> 145 + SettingsBlock.DisplayUntrackedRangeCheckbox -> 189 146 displayDelegate.onUntrackedRangeClicked() 190 147 SettingsBlock.DisplayCalendarView -> 191 148 displayDelegate.onShowRecordsCalendarClicked()