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

razeeman (Jan 9, 2024, 8:52 AM +0300) ab2a6799 f4d706c5

+769 -1024
+22
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsBlock.kt
··· 27 27 NotificationsActivityRecurrent, 28 28 NotificationsActivityDoNotDisturb, 29 29 NotificationsBottom, 30 + 31 + DisplayTop, 32 + DisplayCollapse, 33 + DisplayUntrackedHint, 34 + DisplayUntrackedInRecords, 35 + DisplayUntrackedInStatistics, 36 + DisplayUntrackedIgnoreShort, 37 + DisplayUntrackedRange, 38 + DisplayCalendarView, 39 + DisplayReverseOrder, 40 + DisplayDaysInCalendar, 41 + DisplayShowActivityFilters, 42 + DisplayGoalsOnSeparateTabs, 43 + DisplayKeepScreenOn, 44 + DisplayWidgetBackground, 45 + DisplayMilitaryFormat, 46 + DisplayMonthDayFormat, 47 + DisplayProportionalFormat, 48 + DisplayShowSeconds, 49 + DisplaySortActivities, 50 + DisplayCardSize, 51 + DisplayBottom, 30 52 }
+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 + spaceItemSettingsBottom.visible = item.bottomSpaceIsVisible 33 + 32 34 viewItemSettingsDivider.visible = item.dividerIsVisible 33 35 34 36 checkboxItemSettings.setOnClick { onClick(item.block) } ··· 40 42 val title: String, 41 43 val subtitle: String, 42 44 val isChecked: Boolean, 45 + val bottomSpaceIsVisible: Boolean = true, 43 46 val dividerIsVisible: Boolean = true, 44 47 ) : ViewHolderType { 45 48
+63
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsCheckboxWithRangeAdapterDelegate.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.SettingsCheckboxWithRangeViewData 6 + import com.example.util.simpletimetracker.feature_views.extension.setOnClick 7 + import com.example.util.simpletimetracker.feature_views.extension.visible 8 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsCheckboxWithRangeViewData as ViewData 9 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsCheckboxWithRangeBinding as Binding 10 + 11 + fun createSettingsCheckboxWithRangeAdapterDelegate( 12 + onClick: (SettingsBlock) -> Unit, 13 + onStartClick: (SettingsBlock) -> Unit, 14 + onEndClick: (SettingsBlock) -> Unit, 15 + ) = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 16 + Binding::inflate, 17 + ) { binding, item, _ -> 18 + 19 + with(binding) { 20 + item as ViewData 21 + 22 + tvItemSettingsCheckboxWithRangeTitle.text = item.title 23 + 24 + tvItemSettingsCheckboxWithRangeSubtitle.text = item.subtitle 25 + 26 + if (checkboxItemSettingsCheckboxWithRange.isChecked != item.isChecked) { 27 + checkboxItemSettingsCheckboxWithRange.isChecked = item.isChecked 28 + } 29 + 30 + groupItemSettingsCheckboxWithRange.visible = 31 + item.range is SettingsCheckboxWithRangeViewData.RangeViewData.Enabled 32 + 33 + if (item.range is SettingsCheckboxWithRangeViewData.RangeViewData.Enabled) { 34 + tvItemSettingsCheckboxWithRangeStart.text = item.range.rangeStart 35 + tvItemSettingsCheckboxWithRangeEnd.text = item.range.rangeEnd 36 + } 37 + 38 + checkboxItemSettingsCheckboxWithRange.setOnClick { onClick(item.block) } 39 + tvItemSettingsCheckboxWithRangeStart.setOnClick { onStartClick(item.block) } 40 + tvItemSettingsCheckboxWithRangeEnd.setOnClick { onEndClick(item.block) } 41 + } 42 + } 43 + 44 + data class SettingsCheckboxWithRangeViewData( 45 + val block: SettingsBlock, 46 + val title: String, 47 + val subtitle: String, 48 + val isChecked: Boolean, 49 + val range: RangeViewData, 50 + ) : ViewHolderType { 51 + 52 + override fun getUniqueId(): Long = block.ordinal.toLong() 53 + 54 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 55 + 56 + sealed interface RangeViewData { 57 + object Disabled : RangeViewData 58 + data class Enabled( 59 + val rangeStart: String, 60 + val rangeEnd: String, 61 + ) : RangeViewData 62 + } 63 + }
+27
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsHintAdapterDelegate.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.SettingsHintViewData as ViewData 6 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsHintBinding as Binding 7 + 8 + fun createSettingsHintAdapterDelegate() = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 9 + Binding::inflate, 10 + ) { binding, item, _ -> 11 + 12 + with(binding) { 13 + item as ViewData 14 + 15 + tvItemSettingsHint.text = item.text 16 + } 17 + } 18 + 19 + data class SettingsHintViewData( 20 + val block: SettingsBlock, 21 + val text: String, 22 + ) : ViewHolderType { 23 + 24 + override fun getUniqueId(): Long = block.ordinal.toLong() 25 + 26 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 27 + }
+41
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsSpinnerWithButtonAdapterDelegate.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.SettingsSpinnerWithButtonViewData as ViewData 8 + import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsSpinnerWithButtonBinding as Binding 9 + 10 + fun createSettingsSpinnerWithButtonAdapterDelegate( 11 + onPositionSelected: (block: SettingsBlock, position: Int) -> Unit, 12 + onButtonClicked: (block: SettingsBlock) -> 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.data, 22 + title = tvItemSettingsTitle, 23 + value = tvItemSettingsValue, 24 + spinner = spinnerItemSettings, 25 + onPositionSelected = onPositionSelected, 26 + ) 27 + 28 + btnItemSettingsSpinner.visible = item.isButtonVisible 29 + btnItemSettingsSpinner.setOnClick { onButtonClicked(item.data.block) } 30 + } 31 + } 32 + 33 + data class SettingsSpinnerWithButtonViewData( 34 + val data: SettingsSpinnerViewData, 35 + val isButtonVisible: Boolean, 36 + ) : ViewHolderType { 37 + 38 + override fun getUniqueId(): Long = data.block.ordinal.toLong() 39 + 40 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 41 + }
+251
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsDisplayViewDataInteractor.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.domain.model.WidgetTransparencyPercent 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.SettingsCheckboxWithRangeViewData 12 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsCheckboxWithRangeViewData.RangeViewData 13 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsCollapseViewData 14 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsHintViewData 15 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSelectorViewData 16 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSpinnerViewData 17 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSpinnerWithButtonViewData 18 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTextViewData 19 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTopViewData 20 + import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 21 + import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 22 + import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 23 + import com.example.util.simpletimetracker.feature_settings.viewData.WidgetTransparencyViewData 24 + import javax.inject.Inject 25 + 26 + class SettingsDisplayViewDataInteractor @Inject constructor( 27 + private val resourceRepo: ResourceRepo, 28 + private val settingsMapper: SettingsMapper, 29 + private val prefsInteractor: PrefsInteractor, 30 + ) { 31 + 32 + suspend fun execute( 33 + isCollapsed: Boolean, 34 + ): List<ViewHolderType> { 35 + val result = mutableListOf<ViewHolderType>() 36 + 37 + result += SettingsTopViewData( 38 + block = SettingsBlock.DisplayTop, 39 + ) 40 + 41 + result += SettingsCollapseViewData( 42 + block = SettingsBlock.DisplayCollapse, 43 + title = resourceRepo.getString(R.string.settings_display_title), 44 + opened = !isCollapsed, 45 + dividerIsVisible = !isCollapsed, 46 + ) 47 + 48 + if (!isCollapsed) { 49 + result += SettingsHintViewData( 50 + block = SettingsBlock.DisplayUntrackedHint, 51 + text = resourceRepo.getString(R.string.change_record_untracked_time_hint) 52 + ) 53 + result += SettingsCheckboxViewData( 54 + block = SettingsBlock.DisplayUntrackedInRecords, 55 + title = resourceRepo.getString(R.string.settings_show_untracked_time), 56 + subtitle = "", 57 + isChecked = prefsInteractor.getShowUntrackedInRecords(), 58 + bottomSpaceIsVisible = false, 59 + dividerIsVisible = false, 60 + ) 61 + result += SettingsCheckboxViewData( 62 + block = SettingsBlock.DisplayUntrackedInStatistics, 63 + title = resourceRepo.getString(R.string.settings_show_untracked_time_statistics), 64 + subtitle = "", 65 + isChecked = prefsInteractor.getShowUntrackedInStatistics(), 66 + bottomSpaceIsVisible = false, 67 + dividerIsVisible = false, 68 + ) 69 + result += SettingsSelectorViewData( 70 + block = SettingsBlock.DisplayUntrackedIgnoreShort, 71 + title = resourceRepo.getString(R.string.settings_ignore_short_untracked), 72 + subtitle = resourceRepo.getString(R.string.settings_ignore_short_untracked_hint), 73 + selectedValue = loadIgnoreShortUntrackedViewData(), 74 + bottomSpaceIsVisible = false, 75 + dividerIsVisible = false, 76 + ) 77 + val untrackedRangeViewData = loadUntrackedRangeViewData() 78 + result += SettingsCheckboxWithRangeViewData( 79 + block = SettingsBlock.DisplayUntrackedRange, 80 + title = resourceRepo.getString(R.string.settings_untracked_range), 81 + subtitle = resourceRepo.getString(R.string.settings_untracked_range_hint), 82 + isChecked = untrackedRangeViewData is RangeViewData.Enabled, 83 + range = untrackedRangeViewData, 84 + ) 85 + val showRecordsCalendar = prefsInteractor.getShowRecordsCalendar() 86 + result += SettingsCheckboxViewData( 87 + block = SettingsBlock.DisplayCalendarView, 88 + title = resourceRepo.getString(R.string.settings_show_records_calendar), 89 + subtitle = "", 90 + isChecked = showRecordsCalendar, 91 + bottomSpaceIsVisible = true, 92 + dividerIsVisible = !showRecordsCalendar, 93 + ) 94 + if (showRecordsCalendar) { 95 + result += SettingsCheckboxViewData( 96 + block = SettingsBlock.DisplayReverseOrder, 97 + title = resourceRepo.getString(R.string.settings_reverse_order_in_calendar), 98 + subtitle = "", 99 + isChecked = prefsInteractor.getReverseOrderInCalendar(), 100 + bottomSpaceIsVisible = true, 101 + dividerIsVisible = false, 102 + ) 103 + val daysInCalendarViewData = loadDaysInCalendarViewData() 104 + result += SettingsSpinnerViewData( 105 + block = SettingsBlock.DisplayDaysInCalendar, 106 + title = resourceRepo.getString(R.string.settings_days_in_calendar), 107 + value = daysInCalendarViewData.items 108 + .getOrNull(daysInCalendarViewData.selectedPosition)?.text.orEmpty(), 109 + items = daysInCalendarViewData.items, 110 + selectedPosition = daysInCalendarViewData.selectedPosition, 111 + processSameItemSelected = false, 112 + ) 113 + } 114 + result += SettingsCheckboxViewData( 115 + block = SettingsBlock.DisplayShowActivityFilters, 116 + title = resourceRepo.getString(R.string.settings_show_activity_filters), 117 + subtitle = "", 118 + isChecked = prefsInteractor.getShowActivityFilters(), 119 + bottomSpaceIsVisible = true, 120 + dividerIsVisible = true, 121 + ) 122 + result += SettingsCheckboxViewData( 123 + block = SettingsBlock.DisplayGoalsOnSeparateTabs, 124 + title = resourceRepo.getString(R.string.settings_show_goals_separately), 125 + subtitle = "", 126 + isChecked = prefsInteractor.getShowGoalsSeparately(), 127 + bottomSpaceIsVisible = true, 128 + dividerIsVisible = true, 129 + ) 130 + result += SettingsCheckboxViewData( 131 + block = SettingsBlock.DisplayKeepScreenOn, 132 + title = resourceRepo.getString(R.string.settings_keep_screen_on), 133 + subtitle = "", 134 + isChecked = prefsInteractor.getKeepScreenOn(), 135 + bottomSpaceIsVisible = true, 136 + dividerIsVisible = true, 137 + ) 138 + val widgetTransparencyViewData = loadWidgetTransparencyViewData() 139 + result += SettingsSpinnerViewData( 140 + block = SettingsBlock.DisplayWidgetBackground, 141 + title = resourceRepo.getString(R.string.settings_widget_transparency), 142 + value = widgetTransparencyViewData.selectedValue, 143 + items = widgetTransparencyViewData.items, 144 + selectedPosition = widgetTransparencyViewData.selectedPosition, 145 + processSameItemSelected = false, 146 + ) 147 + result += SettingsCheckboxViewData( 148 + block = SettingsBlock.DisplayMilitaryFormat, 149 + title = resourceRepo.getString(R.string.settings_use_military_time), 150 + subtitle = loadUseMilitaryTimeViewData(), 151 + isChecked = prefsInteractor.getUseMilitaryTimeFormat(), 152 + ) 153 + result += SettingsCheckboxViewData( 154 + block = SettingsBlock.DisplayMonthDayFormat, 155 + title = resourceRepo.getString(R.string.settings_use_monthday_time), 156 + subtitle = loadUseMonthDayTimeViewData(), 157 + isChecked = prefsInteractor.getUseMonthDayTimeFormat(), 158 + ) 159 + result += SettingsCheckboxViewData( 160 + block = SettingsBlock.DisplayProportionalFormat, 161 + title = resourceRepo.getString(R.string.settings_use_proportional_minutes), 162 + subtitle = loadUseProportionalMinutesViewData(), 163 + isChecked = prefsInteractor.getUseProportionalMinutes(), 164 + ) 165 + result += SettingsCheckboxViewData( 166 + block = SettingsBlock.DisplayShowSeconds, 167 + title = resourceRepo.getString(R.string.settings_show_seconds), 168 + subtitle = "", 169 + isChecked = prefsInteractor.getShowSeconds(), 170 + ) 171 + val cardOrderViewData = loadCardOrderViewData() 172 + result += SettingsSpinnerWithButtonViewData( 173 + data = SettingsSpinnerViewData( 174 + block = SettingsBlock.DisplaySortActivities, 175 + title = resourceRepo.getString(R.string.settings_sort_order), 176 + value = cardOrderViewData.items 177 + .getOrNull(cardOrderViewData.selectedPosition)?.text.orEmpty(), 178 + items = cardOrderViewData.items, 179 + selectedPosition = cardOrderViewData.selectedPosition, 180 + processSameItemSelected = false, 181 + ), 182 + isButtonVisible = cardOrderViewData.isManualConfigButtonVisible, 183 + ) 184 + result += SettingsTextViewData( 185 + block = SettingsBlock.DisplayCardSize, 186 + title = resourceRepo.getString(R.string.settings_change_card_size), 187 + subtitle = "", 188 + dividerIsVisible = false, 189 + ) 190 + } 191 + 192 + result += SettingsBottomViewData( 193 + block = SettingsBlock.DisplayBottom, 194 + ) 195 + 196 + return result 197 + } 198 + 199 + private suspend fun loadIgnoreShortUntrackedViewData(): String { 200 + return prefsInteractor.getIgnoreShortUntrackedDuration() 201 + .let(settingsMapper::toDurationViewData) 202 + .text 203 + } 204 + 205 + private suspend fun loadUntrackedRangeViewData(): RangeViewData { 206 + val enabled = prefsInteractor.getUntrackedRangeEnabled() 207 + 208 + return if (enabled) { 209 + val start = prefsInteractor.getUntrackedRangeStart() 210 + val end = prefsInteractor.getUntrackedRangeEnd() 211 + val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 212 + RangeViewData.Enabled( 213 + settingsMapper.toStartOfDayText(start, useMilitaryTime), 214 + settingsMapper.toStartOfDayText(end, useMilitaryTime), 215 + ) 216 + } else { 217 + RangeViewData.Disabled 218 + } 219 + } 220 + 221 + private suspend fun loadDaysInCalendarViewData(): DaysInCalendarViewData { 222 + return prefsInteractor.getDaysInCalendar() 223 + .let(settingsMapper::toDaysInCalendarViewData) 224 + } 225 + 226 + private suspend fun loadWidgetTransparencyViewData(): WidgetTransparencyViewData { 227 + return prefsInteractor.getWidgetBackgroundTransparencyPercent() 228 + .let(::WidgetTransparencyPercent) 229 + .let(settingsMapper::toWidgetTransparencyViewData) 230 + } 231 + 232 + private suspend fun loadUseMilitaryTimeViewData(): String { 233 + return prefsInteractor.getUseMilitaryTimeFormat() 234 + .let(settingsMapper::toUseMilitaryTimeHint) 235 + } 236 + 237 + private suspend fun loadUseMonthDayTimeViewData(): String { 238 + return prefsInteractor.getUseMonthDayTimeFormat() 239 + .let(settingsMapper::toUseMonthDayTimeHint) 240 + } 241 + 242 + private suspend fun loadUseProportionalMinutesViewData(): String { 243 + return prefsInteractor.getUseProportionalMinutes() 244 + .let(settingsMapper::toUseProportionalMinutesHint) 245 + } 246 + 247 + private suspend fun loadCardOrderViewData(): CardOrderViewData { 248 + return prefsInteractor.getCardOrder() 249 + .let(settingsMapper::toCardOrderViewData) 250 + } 251 + }
+3
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsNotificationsViewDataInteractor.kt
··· 44 44 title = resourceRepo.getString(R.string.settings_show_notifications), 45 45 subtitle = resourceRepo.getString(R.string.settings_show_notifications_hint), 46 46 isChecked = showNotifications, 47 + bottomSpaceIsVisible = !showNotifications, 47 48 dividerIsVisible = !showNotifications, 48 49 ) 49 50 if (showNotifications) { ··· 70 71 title = resourceRepo.getString(R.string.settings_inactivity_reminder_recurrent), 71 72 subtitle = "", 72 73 isChecked = prefsInteractor.getInactivityReminderRecurrent(), 74 + bottomSpaceIsVisible = false, 73 75 dividerIsVisible = false, 74 76 ) 75 77 result += SettingsRangeViewData( ··· 95 97 title = resourceRepo.getString(R.string.settings_inactivity_reminder_recurrent), 96 98 subtitle = "", 97 99 isChecked = prefsInteractor.getActivityReminderRecurrent(), 100 + bottomSpaceIsVisible = false, 98 101 dividerIsVisible = false, 99 102 ) 100 103 result += SettingsRangeViewData(
+19 -122
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 16 16 import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter 17 17 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsBottomAdapterDelegate 18 18 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsCheckboxAdapterDelegate 19 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsCheckboxWithRangeAdapterDelegate 19 20 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsCollapseAdapterDelegate 21 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsHintAdapterDelegate 20 22 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsRangeAdapterDelegate 21 23 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsSelectorAdapterDelegate 22 24 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsSpinnerAdapterDelegate 23 25 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsSpinnerNotCheckableAdapterDelegate 26 + import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsSpinnerWithButtonAdapterDelegate 24 27 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsTextAdapterDelegate 25 28 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsTopAdapterDelegate 26 29 import com.example.util.simpletimetracker.feature_settings.adapter.createSettingsTranslatorAdapterDelegate 27 - import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 28 - import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 29 30 import com.example.util.simpletimetracker.feature_settings.viewData.FirstDayOfWeekViewData 30 31 import com.example.util.simpletimetracker.feature_settings.viewData.RepeatButtonViewData 31 32 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsStartOfDayViewData 32 - import com.example.util.simpletimetracker.feature_settings.viewData.SettingsUntrackedRangeViewData 33 - import com.example.util.simpletimetracker.feature_settings.viewData.WidgetTransparencyViewData 34 33 import com.example.util.simpletimetracker.feature_settings.viewModel.SettingsViewModel 35 34 import com.example.util.simpletimetracker.feature_views.extension.rotateDown 36 35 import com.example.util.simpletimetracker.feature_views.extension.rotateUp ··· 77 76 createSettingsSpinnerNotCheckableAdapterDelegate(viewModel::onSpinnerPositionSelected), 78 77 createSettingsCollapseAdapterDelegate(viewModel::onCollapseClicked), 79 78 createSettingsSelectorAdapterDelegate(viewModel::onSelectorClicked), 80 - createSettingsRangeAdapterDelegate(viewModel::onRangeStartClicked, viewModel::onRangeEndClicked) 79 + createSettingsHintAdapterDelegate(), 80 + createSettingsRangeAdapterDelegate( 81 + onStartClick = viewModel::onRangeStartClicked, 82 + onEndClick = viewModel::onRangeEndClicked, 83 + ), 84 + createSettingsSpinnerWithButtonAdapterDelegate( 85 + viewModel::onSpinnerPositionSelected, 86 + viewModel::onButtonClicked, 87 + ), 88 + createSettingsCheckboxWithRangeAdapterDelegate( 89 + onClick = viewModel::onCheckboxClicked, 90 + onStartClick = viewModel::onRangeStartClicked, 91 + onEndClick = viewModel::onRangeEndClicked, 92 + ), 81 93 ) 82 94 } 83 95 84 96 override fun initUi() = with(binding) { 85 97 rvSettingsContent.adapter = contentAdapter 98 + rvSettingsContent.itemAnimator = null 86 99 layoutSettingsTranslators.rvSettingsTranslators.adapter = translatorsAdapter 87 - layoutSettingsDisplay.spinnerSettingsDaysInCalendar.setProcessSameItemSelection(false) 88 - layoutSettingsDisplay.spinnerSettingsWidgetTransparency.setProcessSameItemSelection(false) 89 - layoutSettingsDisplay.spinnerSettingsRecordTypeSort.setProcessSameItemSelection(false) 90 100 layoutSettingsAdditional.spinnerSettingsFirstDayOfWeek.setProcessSameItemSelection(false) 91 101 layoutSettingsAdditional.spinnerSettingsRepeatButtonType.setProcessSameItemSelection(false) 92 102 } 93 103 94 104 override fun initUx() = with(binding) { 95 - with(layoutSettingsDisplay) { 96 - with(viewModel.displayDelegate) { 97 - layoutSettingsDisplayTitle.setOnClick(viewModel::onSettingsDisplayClick) 98 - spinnerSettingsDaysInCalendar.onPositionSelected = ::onDaysInCalendarSelected 99 - spinnerSettingsWidgetTransparency.onPositionSelected = ::onWidgetTransparencySelected 100 - spinnerSettingsRecordTypeSort.onPositionSelected = ::onRecordTypeOrderSelected 101 - btnCardOrderManual.setOnClick(::onCardOrderManualClick) 102 - checkboxSettingsShowUntrackedInRecords.setOnClick(::onShowUntrackedInRecordsClicked) 103 - checkboxSettingsShowUntrackedInStatistics.setOnClick(::onShowUntrackedInStatisticsClicked) 104 - groupSettingsIgnoreShortUntracked.setOnClick(::onIgnoreShortUntrackedClicked) 105 - checkboxSettingsUntrackedRange.setOnClick(::onUntrackedRangeClicked) 106 - tvSettingsUntrackedRangeStart.setOnClick(::onUntrackedRangeStartClicked) 107 - tvSettingsUntrackedRangeEnd.setOnClick(::onUntrackedRangeEndClicked) 108 - checkboxSettingsShowRecordsCalendar.setOnClick(::onShowRecordsCalendarClicked) 109 - checkboxSettingsReverseOrderInCalendar.setOnClick(::onReverseOrderInCalendarClicked) 110 - checkboxSettingsShowActivityFilters.setOnClick(::onShowActivityFiltersClicked) 111 - checkboxSettingsShowGoalsSeparately.setOnClick(::onShowGoalsSeparatelyClicked) 112 - checkboxSettingsUseMilitaryTime.setOnClick(::onUseMilitaryTimeClicked) 113 - checkboxSettingsUseMonthDayTime.setOnClick(::onUseMonthDayTimeClicked) 114 - checkboxSettingsUseProportionalMinutes.setOnClick(::onUseProportionalMinutesClicked) 115 - checkboxSettingsShowSeconds.setOnClick(::onShowSecondsClicked) 116 - checkboxSettingsKeepScreenOn.setOnClick(::onKeepScreenOnClicked) 117 - tvSettingsChangeCardSize.setOnClick(::onChangeCardSizeClick) 118 - } 119 - } 120 - 121 105 with(layoutSettingsAdditional) { 122 106 with(viewModel.additionalDelegate) { 123 107 layoutSettingsAdditionalTitle.setOnClick(viewModel::onSettingsAdditionalClick) ··· 156 140 with(viewModel) { 157 141 content.observe(contentAdapter::replace) 158 142 159 - viewModel.settingsDisplayVisibility.observe { opened -> 160 - layoutSettingsDisplay.layoutSettingsDisplayContent.visible = opened 161 - layoutSettingsDisplay.arrowSettingsDisplay 162 - .apply { if (opened) rotateDown() else rotateUp() } 163 - } 164 143 viewModel.settingsAdditionalVisibility.observe { opened -> 165 144 layoutSettingsAdditional.layoutSettingsAdditionalContent.visible = opened 166 145 layoutSettingsAdditional.arrowSettingsAdditional ··· 187 166 } 188 167 189 168 with(viewModel.displayDelegate) { 190 - with(layoutSettingsDisplay) { 191 - btnCardOrderManualVisibility.observe(btnCardOrderManual::visible::set) 192 - showUntrackedInRecordsCheckbox.observe(checkboxSettingsShowUntrackedInRecords::setChecked) 193 - showUntrackedInStatisticsCheckbox.observe(checkboxSettingsShowUntrackedInStatistics::setChecked) 194 - ignoreShortUntrackedViewData.observe(tvSettingsIgnoreShortUntrackedTime::setText) 195 - untrackedRangeViewData.observe(::setUntrackedRangeViewData) 196 - showRecordsCalendarCheckbox.observe(::updateShowRecordCalendarChecked) 197 - daysInCalendarViewData.observe(::updateDaysInCalendarViewData) 198 - widgetTransparencyViewData.observe(::updateWidgetTransparencyViewData) 199 - reverseOrderInCalendarCheckbox.observe(checkboxSettingsReverseOrderInCalendar::setChecked) 200 - showActivityFiltersCheckbox.observe(checkboxSettingsShowActivityFilters::setChecked) 201 - showGoalsSeparatelyCheckbox.observe(checkboxSettingsShowGoalsSeparately::setChecked) 202 - useMilitaryTimeCheckbox.observe(checkboxSettingsUseMilitaryTime::setChecked) 203 - useMonthDayTimeCheckbox.observe(checkboxSettingsUseMonthDayTime::setChecked) 204 - useProportionalMinutesCheckbox.observe(checkboxSettingsUseProportionalMinutes::setChecked) 205 - showSecondsCheckbox.observe(checkboxSettingsShowSeconds::setChecked) 206 - useMilitaryTimeHint.observe(tvSettingsUseMilitaryTimeHint::setText) 207 - useMonthDayTimeHint.observe(tvSettingsUseMonthDayTimeHint::setText) 208 - useProportionalMinutesHint.observe(tvSettingsUseProportionalMinutesHint::setText) 209 - cardOrderViewData.observe(::updateCardOrderViewData) 210 - keepScreenOnCheckbox.observe(::setKeepScreenOn) 211 - } 169 + keepScreenOnCheckbox.observe(::setKeepScreenOn) 212 170 } 213 171 214 172 with(viewModel.additionalDelegate) { ··· 253 211 254 212 override fun onResume() = with(binding) { 255 213 super.onResume() 256 - with(layoutSettingsDisplay) { 257 - spinnerSettingsDaysInCalendar.jumpDrawablesToCurrentState() 258 - spinnerSettingsWidgetTransparency.jumpDrawablesToCurrentState() 259 - spinnerSettingsRecordTypeSort.jumpDrawablesToCurrentState() 260 - checkboxSettingsShowUntrackedInRecords.jumpDrawablesToCurrentState() 261 - checkboxSettingsShowUntrackedInStatistics.jumpDrawablesToCurrentState() 262 - checkboxSettingsUntrackedRange.jumpDrawablesToCurrentState() 263 - checkboxSettingsShowRecordsCalendar.jumpDrawablesToCurrentState() 264 - checkboxSettingsReverseOrderInCalendar.jumpDrawablesToCurrentState() 265 - checkboxSettingsShowActivityFilters.jumpDrawablesToCurrentState() 266 - checkboxSettingsShowGoalsSeparately.jumpDrawablesToCurrentState() 267 - checkboxSettingsUseMilitaryTime.jumpDrawablesToCurrentState() 268 - checkboxSettingsUseMonthDayTime.jumpDrawablesToCurrentState() 269 - checkboxSettingsUseProportionalMinutes.jumpDrawablesToCurrentState() 270 - checkboxSettingsShowSeconds.jumpDrawablesToCurrentState() 271 - checkboxSettingsKeepScreenOn.jumpDrawablesToCurrentState() 272 - } 273 214 with(layoutSettingsAdditional) { 274 215 spinnerSettingsFirstDayOfWeek.jumpDrawablesToCurrentState() 275 216 spinnerSettingsRepeatButtonType.jumpDrawablesToCurrentState() ··· 308 249 backupViewModel.onDataExportSettingsSelected(data) 309 250 } 310 251 311 - private fun updateCardOrderViewData( 312 - viewData: CardOrderViewData, 313 - ) = with(binding.layoutSettingsDisplay) { 314 - btnCardOrderManual.visible = viewData.isManualConfigButtonVisible 315 - spinnerSettingsRecordTypeSort.setData(viewData.items, viewData.selectedPosition) 316 - tvSettingsRecordTypeSortValue.text = viewData.items 317 - .getOrNull(viewData.selectedPosition)?.text.orEmpty() 318 - } 319 - 320 - private fun updateDaysInCalendarViewData( 321 - viewData: DaysInCalendarViewData, 322 - ) = with(binding.layoutSettingsDisplay) { 323 - spinnerSettingsDaysInCalendar.setData(viewData.items, viewData.selectedPosition) 324 - tvSettingsDaysInCalendarValue.text = viewData.items 325 - .getOrNull(viewData.selectedPosition)?.text.orEmpty() 326 - } 327 - 328 - private fun updateWidgetTransparencyViewData( 329 - viewData: WidgetTransparencyViewData, 330 - ) = with(binding.layoutSettingsDisplay) { 331 - spinnerSettingsWidgetTransparency.setData(viewData.items, viewData.selectedPosition) 332 - tvSettingsWidgetTransparencyValue.text = viewData.selectedValue 333 - } 334 - 335 252 private fun updateFirstDayOfWeekViewData( 336 253 viewData: FirstDayOfWeekViewData, 337 254 ) = with(binding.layoutSettingsAdditional) { ··· 355 272 groupSettingsRecordTagSelectionClose.visible = isChecked 356 273 } 357 274 358 - private fun updateShowRecordCalendarChecked( 359 - isChecked: Boolean, 360 - ) = with(binding.layoutSettingsDisplay) { 361 - checkboxSettingsShowRecordsCalendar.isChecked = isChecked 362 - groupSettingsReverseOrderInCalendar.visible = isChecked 363 - } 364 - 365 - private fun setUntrackedRangeViewData( 366 - viewData: SettingsUntrackedRangeViewData, 367 - ) = with(binding.layoutSettingsDisplay) { 368 - groupSettingsUntrackedRange.visible = viewData is SettingsUntrackedRangeViewData.Enabled 369 - checkboxSettingsUntrackedRange.isChecked = viewData is SettingsUntrackedRangeViewData.Enabled 370 - 371 - if (viewData is SettingsUntrackedRangeViewData.Enabled) { 372 - tvSettingsUntrackedRangeStart.text = viewData.rangeStart 373 - tvSettingsUntrackedRangeEnd.text = viewData.rangeEnd 374 - } 375 - } 376 - 377 275 private fun updateStartOfDayViewData( 378 276 viewData: SettingsStartOfDayViewData, 379 277 ) = with(binding.layoutSettingsAdditional) { ··· 384 282 } 385 283 386 284 private fun setKeepScreenOn(keepScreenOn: Boolean) { 387 - binding.layoutSettingsDisplay.checkboxSettingsKeepScreenOn.isChecked = keepScreenOn 388 285 if (keepScreenOn) { 389 286 activity?.window?.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) 390 287 } else {
+56 -3
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt
··· 68 68 } 69 69 70 70 fun onVisible() { 71 - displayDelegate.onVisible() 72 71 additionalDelegate.onVisible() 73 72 // Update can come from quick settings widget. 74 73 // Update can come from system settings. 74 + // Need to update card order because it changes on card order dialog. 75 75 viewModelScope.launch { updateContent() } 76 76 } 77 77 78 + // TODO merge all click functions into one, and move to delegates. 78 79 fun onCollapseClicked(block: SettingsBlock) { 79 80 when (block) { 80 81 SettingsBlock.NotificationsCollapse -> 81 82 notificationsDelegate.onCollapseClick() 83 + SettingsBlock.DisplayCollapse -> 84 + displayDelegate.onCollapseClick() 82 85 else -> { 83 86 // Do nothing 84 87 } ··· 91 94 notificationsDelegate.onInactivityReminderClicked() 92 95 SettingsBlock.NotificationsActivity -> 93 96 notificationsDelegate.onActivityReminderClicked() 97 + SettingsBlock.DisplayUntrackedIgnoreShort -> 98 + displayDelegate.onIgnoreShortUntrackedClicked() 94 99 else -> { 95 100 // Do nothing 96 101 } ··· 103 108 notificationsDelegate.onInactivityReminderDoNotDisturbStartClicked() 104 109 SettingsBlock.NotificationsActivityDoNotDisturb -> 105 110 notificationsDelegate.onActivityReminderDoNotDisturbStartClicked() 111 + SettingsBlock.DisplayUntrackedRange -> 112 + displayDelegate.onUntrackedRangeStartClicked() 106 113 else -> { 107 114 // Do nothing 108 115 } ··· 115 122 notificationsDelegate.onInactivityReminderDoNotDisturbEndClicked() 116 123 SettingsBlock.NotificationsActivityDoNotDisturb -> 117 124 notificationsDelegate.onActivityReminderDoNotDisturbEndClicked() 125 + SettingsBlock.DisplayUntrackedRange -> 126 + displayDelegate.onUntrackedRangeEndClicked() 118 127 else -> { 119 128 // Do nothing 120 129 } ··· 128 137 SettingsBlock.DataEdit -> mainDelegate.onDataEditClick() 129 138 SettingsBlock.RateUs -> ratingDelegate.onRateClick() 130 139 SettingsBlock.Feedback -> ratingDelegate.onFeedbackClick() 140 + SettingsBlock.DisplayCardSize -> displayDelegate.onChangeCardSizeClick() 141 + else -> { 142 + // Do nothing 143 + } 144 + } 145 + } 146 + 147 + fun onButtonClicked(block: SettingsBlock) { 148 + when (block) { 149 + SettingsBlock.DisplaySortActivities -> 150 + displayDelegate.onCardOrderManualClick() 131 151 else -> { 132 152 // Do nothing 133 153 } ··· 146 166 notificationsDelegate.onInactivityReminderRecurrentClicked() 147 167 SettingsBlock.NotificationsActivityRecurrent -> 148 168 notificationsDelegate.onActivityReminderRecurrentClicked() 169 + SettingsBlock.DisplayUntrackedInRecords -> 170 + displayDelegate.onShowUntrackedInRecordsClicked() 171 + SettingsBlock.DisplayUntrackedInStatistics -> 172 + displayDelegate.onShowUntrackedInStatisticsClicked() 173 + SettingsBlock.DisplayUntrackedRange -> 174 + displayDelegate.onUntrackedRangeClicked() 175 + SettingsBlock.DisplayCalendarView -> 176 + displayDelegate.onShowRecordsCalendarClicked() 177 + SettingsBlock.DisplayReverseOrder -> 178 + displayDelegate.onReverseOrderInCalendarClicked() 179 + SettingsBlock.DisplayShowActivityFilters -> 180 + displayDelegate.onShowActivityFiltersClicked() 181 + SettingsBlock.DisplayGoalsOnSeparateTabs -> 182 + displayDelegate.onShowGoalsSeparatelyClicked() 183 + SettingsBlock.DisplayKeepScreenOn -> 184 + displayDelegate.onKeepScreenOnClicked() 185 + SettingsBlock.DisplayMilitaryFormat -> 186 + displayDelegate.onUseMilitaryTimeClicked() 187 + SettingsBlock.DisplayMonthDayFormat -> 188 + displayDelegate.onUseMonthDayTimeClicked() 189 + SettingsBlock.DisplayProportionalFormat -> 190 + displayDelegate.onUseProportionalMinutesClicked() 191 + SettingsBlock.DisplayShowSeconds -> 192 + displayDelegate.onShowSecondsClicked() 149 193 else -> { 150 194 // Do nothing 151 195 } ··· 154 198 155 199 fun onSpinnerPositionSelected(block: SettingsBlock, position: Int) { 156 200 when (block) { 157 - SettingsBlock.DarkMode -> mainDelegate.onDarkModeSelected(position) 158 - SettingsBlock.Language -> mainDelegate.onLanguageSelected(position) 201 + SettingsBlock.DarkMode -> 202 + mainDelegate.onDarkModeSelected(position) 203 + SettingsBlock.Language -> 204 + mainDelegate.onLanguageSelected(position) 205 + SettingsBlock.DisplayDaysInCalendar -> 206 + displayDelegate.onDaysInCalendarSelected(position) 207 + SettingsBlock.DisplayWidgetBackground -> 208 + displayDelegate.onWidgetTransparencySelected(position) 209 + SettingsBlock.DisplaySortActivities -> 210 + displayDelegate.onRecordTypeOrderSelected(position) 159 211 else -> { 160 212 // Do nothing 161 213 } ··· 249 301 result += mainDelegate.getViewData() 250 302 result += ratingDelegate.getViewData() 251 303 result += notificationsDelegate.getViewData() 304 + result += displayDelegate.getViewData() 252 305 return result 253 306 } 254 307
+33 -165
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsDisplayViewModelDelegate.kt
··· 1 1 package com.example.util.simpletimetracker.feature_settings.viewModel.delegate 2 2 3 3 import androidx.lifecycle.LiveData 4 - import androidx.lifecycle.MutableLiveData 5 4 import com.example.util.simpletimetracker.core.base.ViewModelDelegate 6 5 import com.example.util.simpletimetracker.core.extension.lazySuspend 7 6 import com.example.util.simpletimetracker.core.extension.set 7 + import com.example.util.simpletimetracker.domain.extension.flip 8 8 import com.example.util.simpletimetracker.domain.interactor.NotificationTypeInteractor 9 9 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 10 10 import com.example.util.simpletimetracker.domain.interactor.WidgetInteractor 11 11 import com.example.util.simpletimetracker.domain.model.CardOrder 12 12 import com.example.util.simpletimetracker.domain.model.WidgetTransparencyPercent 13 13 import com.example.util.simpletimetracker.domain.model.WidgetType 14 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 15 + import com.example.util.simpletimetracker.feature_settings.interactor.SettingsDisplayViewDataInteractor 14 16 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 15 - import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 16 - import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData 17 - import com.example.util.simpletimetracker.feature_settings.viewData.SettingsUntrackedRangeViewData 18 - import com.example.util.simpletimetracker.feature_settings.viewData.WidgetTransparencyViewData 19 17 import com.example.util.simpletimetracker.feature_settings.viewModel.SettingsViewModel 20 18 import com.example.util.simpletimetracker.navigation.Router 21 19 import com.example.util.simpletimetracker.navigation.params.screen.CardOrderDialogParams ··· 30 28 private val settingsMapper: SettingsMapper, 31 29 private val notificationTypeInteractor: NotificationTypeInteractor, 32 30 private val widgetInteractor: WidgetInteractor, 31 + private val settingsDisplayViewDataInteractor: SettingsDisplayViewDataInteractor, 33 32 ) : ViewModelDelegate() { 34 33 35 - val cardOrderViewData: LiveData<CardOrderViewData> 36 - by lazySuspend { loadCardOrderViewData() } 37 - val btnCardOrderManualVisibility: LiveData<Boolean> 38 - by lazySuspend { prefsInteractor.getCardOrder() == CardOrder.MANUAL } 39 - val showUntrackedInRecordsCheckbox: LiveData<Boolean> 40 - by lazySuspend { prefsInteractor.getShowUntrackedInRecords() } 41 - val showUntrackedInStatisticsCheckbox: LiveData<Boolean> 42 - by lazySuspend { prefsInteractor.getShowUntrackedInStatistics() } 43 - val ignoreShortUntrackedViewData: LiveData<String> 44 - by lazySuspend { loadIgnoreShortUntrackedViewData() } 45 - val untrackedRangeViewData: LiveData<SettingsUntrackedRangeViewData> 46 - by lazySuspend { loadUntrackedRangeViewData() } 47 - val showRecordsCalendarCheckbox: LiveData<Boolean> 48 - by lazySuspend { prefsInteractor.getShowRecordsCalendar() } 49 - val reverseOrderInCalendarCheckbox: LiveData<Boolean> 50 - by lazySuspend { prefsInteractor.getReverseOrderInCalendar() } 51 - val daysInCalendarViewData: LiveData<DaysInCalendarViewData> 52 - by lazySuspend { loadDaysInCalendarViewData() } 53 - val widgetTransparencyViewData: LiveData<WidgetTransparencyViewData> 54 - by lazySuspend { loadWidgetTransparencyViewData() } 55 - val showActivityFiltersCheckbox: LiveData<Boolean> 56 - by lazySuspend { prefsInteractor.getShowActivityFilters() } 57 - val showGoalsSeparatelyCheckbox: LiveData<Boolean> 58 - by lazySuspend { prefsInteractor.getShowGoalsSeparately() } 59 - val useMilitaryTimeCheckbox: LiveData<Boolean> 60 - by lazySuspend { prefsInteractor.getUseMilitaryTimeFormat() } 61 - val useMilitaryTimeHint: LiveData<String> 62 - by lazySuspend { loadUseMilitaryTimeViewData() } 63 - val useMonthDayTimeCheckbox: LiveData<Boolean> 64 - by lazySuspend { prefsInteractor.getUseMonthDayTimeFormat() } 65 - val useMonthDayTimeHint: LiveData<String> 66 - by lazySuspend { loadUseMonthDayTimeViewData() } 67 - val useProportionalMinutesCheckbox: LiveData<Boolean> 68 - by lazySuspend { prefsInteractor.getUseProportionalMinutes() } 69 - val useProportionalMinutesHint: LiveData<String> 70 - by lazySuspend { loadUseProportionalMinutesViewData() } 71 - val showSecondsCheckbox: LiveData<Boolean> 72 - by lazySuspend { prefsInteractor.getShowSeconds() } 73 34 val keepScreenOnCheckbox: LiveData<Boolean> 74 35 by lazySuspend { prefsInteractor.getKeepScreenOn() } 75 36 76 37 private var parent: SettingsParent? = null 38 + private var isCollapsed: Boolean = true 77 39 78 40 fun init(parent: SettingsParent) { 79 41 this.parent = parent 80 42 } 81 43 82 - fun onVisible() { 83 - delegateScope.launch { 84 - // Need to update card order because it changes on card order dialog 85 - updateCardOrderViewData() 86 - } 44 + suspend fun getViewData(): List<ViewHolderType> { 45 + return settingsDisplayViewDataInteractor.execute( 46 + isCollapsed = isCollapsed, 47 + ) 48 + } 49 + 50 + fun onCollapseClick() = delegateScope.launch { 51 + isCollapsed = isCollapsed.flip() 52 + parent?.updateContent() 87 53 } 88 54 89 55 fun onDaysInCalendarSelected(position: Int) { ··· 92 58 val newValue = settingsMapper.toDaysInCalendar(position) 93 59 if (newValue == currentValue) return@launch 94 60 prefsInteractor.setDaysInCalendar(newValue) 95 - updateDaysInCalendarViewData() 61 + parent?.updateContent() 96 62 } 97 63 } 98 64 ··· 103 69 val newValue = settingsMapper.toWidgetTransparency(position) 104 70 if (newValue == currentValue) return@launch 105 71 prefsInteractor.setWidgetBackgroundTransparencyPercent(newValue.value) 106 - updateWidgetTransparencyViewData() 72 + parent?.updateContent() 107 73 widgetInteractor.updateWidgets() 108 74 } 109 75 } ··· 114 80 val newOrder = settingsMapper.toCardOrder(position) 115 81 if (newOrder == currentOrder) return@launch 116 82 117 - btnCardOrderManualVisibility.set(newOrder == CardOrder.MANUAL) 118 83 if (newOrder == CardOrder.MANUAL) { 119 84 openCardOrderDialog(currentOrder) 120 85 } 121 86 prefsInteractor.setCardOrder(newOrder) 122 - updateCardOrderViewData() 87 + parent?.updateContent() 123 88 } 124 89 } 125 90 ··· 131 96 delegateScope.launch { 132 97 val newValue = !prefsInteractor.getShowUntrackedInRecords() 133 98 prefsInteractor.setShowUntrackedInRecords(newValue) 134 - showUntrackedInRecordsCheckbox.set(newValue) 99 + parent?.updateContent() 135 100 } 136 101 } 137 102 ··· 139 104 delegateScope.launch { 140 105 val newValue = !prefsInteractor.getShowUntrackedInStatistics() 141 106 prefsInteractor.setShowUntrackedInStatistics(newValue) 142 - showUntrackedInStatisticsCheckbox.set(newValue) 143 107 widgetInteractor.updateWidgets(listOf(WidgetType.STATISTICS_CHART)) 108 + parent?.updateContent() 144 109 } 145 110 } 146 111 ··· 157 122 delegateScope.launch { 158 123 val newValue = !prefsInteractor.getUntrackedRangeEnabled() 159 124 prefsInteractor.setUntrackedRangeEnabled(newValue) 160 - updateUntrackedRangeViewData() 125 + parent?.updateContent() 161 126 } 162 127 } 163 128 ··· 185 150 delegateScope.launch { 186 151 val newValue = !prefsInteractor.getShowRecordsCalendar() 187 152 prefsInteractor.setShowRecordsCalendar(newValue) 188 - (showRecordsCalendarCheckbox as MutableLiveData).value = newValue 153 + parent?.updateContent() 189 154 } 190 155 } 191 156 ··· 193 158 delegateScope.launch { 194 159 val newValue = !prefsInteractor.getReverseOrderInCalendar() 195 160 prefsInteractor.setReverseOrderInCalendar(newValue) 196 - (reverseOrderInCalendarCheckbox as MutableLiveData).value = newValue 161 + parent?.updateContent() 197 162 } 198 163 } 199 164 ··· 201 166 delegateScope.launch { 202 167 val newValue = !prefsInteractor.getShowActivityFilters() 203 168 prefsInteractor.setShowActivityFilters(newValue) 204 - (showActivityFiltersCheckbox as MutableLiveData).value = newValue 169 + parent?.updateContent() 205 170 } 206 171 } 207 172 ··· 209 174 delegateScope.launch { 210 175 val newValue = !prefsInteractor.getShowGoalsSeparately() 211 176 prefsInteractor.setShowGoalsSeparately(newValue) 212 - (showGoalsSeparatelyCheckbox as MutableLiveData).value = newValue 177 + parent?.updateContent() 213 178 router.restartApp() 214 179 } 215 180 } ··· 218 183 delegateScope.launch { 219 184 val newValue = !prefsInteractor.getUseMilitaryTimeFormat() 220 185 prefsInteractor.setUseMilitaryTimeFormat(newValue) 221 - (useMilitaryTimeCheckbox as MutableLiveData).value = newValue 222 186 notificationTypeInteractor.updateNotifications() 223 - updateUseMilitaryTimeViewData() 224 - updateUntrackedRangeViewData() 225 187 parent?.onUseMilitaryTimeClicked() 226 188 parent?.updateContent() 227 189 } ··· 231 193 delegateScope.launch { 232 194 val newValue = !prefsInteractor.getUseMonthDayTimeFormat() 233 195 prefsInteractor.setUseMonthDayTimeFormat(newValue) 234 - (useMonthDayTimeCheckbox as MutableLiveData).value = newValue 235 - updateUseMonthDayTimeViewData() 196 + parent?.updateContent() 236 197 } 237 198 } 238 199 ··· 240 201 delegateScope.launch { 241 202 val newValue = !prefsInteractor.getUseProportionalMinutes() 242 203 prefsInteractor.setUseProportionalMinutes(newValue) 243 - (useProportionalMinutesCheckbox as MutableLiveData).value = newValue 244 204 notificationTypeInteractor.updateNotifications() 245 205 widgetInteractor.updateWidgets(listOf(WidgetType.STATISTICS_CHART)) 246 - updateUseProportionalMinutesViewData() 206 + parent?.updateContent() 247 207 } 248 208 } 249 209 ··· 251 211 delegateScope.launch { 252 212 val newValue = !prefsInteractor.getShowSeconds() 253 213 prefsInteractor.setShowSeconds(newValue) 254 - showSecondsCheckbox.set(newValue) 214 + parent?.updateContent() 255 215 notificationTypeInteractor.updateNotifications() 256 216 widgetInteractor.updateWidgets(listOf(WidgetType.STATISTICS_CHART)) 257 217 } ··· 261 221 delegateScope.launch { 262 222 val newValue = !prefsInteractor.getKeepScreenOn() 263 223 prefsInteractor.setKeepScreenOn(newValue) 264 - (keepScreenOnCheckbox as MutableLiveData).value = newValue 224 + keepScreenOnCheckbox.set(newValue) 225 + parent?.updateContent() 265 226 } 266 227 } 267 228 ··· 273 234 when (tag) { 274 235 SettingsViewModel.IGNORE_SHORT_UNTRACKED_DIALOG_TAG -> delegateScope.launch { 275 236 prefsInteractor.setIgnoreShortUntrackedDuration(duration) 276 - updateIgnoreShortUntrackedViewData() 237 + parent?.updateContent() 277 238 } 278 239 } 279 240 } ··· 282 243 when (tag) { 283 244 SettingsViewModel.IGNORE_SHORT_UNTRACKED_DIALOG_TAG -> delegateScope.launch { 284 245 prefsInteractor.setIgnoreShortUntrackedDuration(0) 285 - updateIgnoreShortUntrackedViewData() 246 + parent?.updateContent() 286 247 } 287 248 } 288 249 } ··· 292 253 SettingsViewModel.UNTRACKED_RANGE_START_DIALOG_TAG -> { 293 254 val newValue = settingsMapper.toStartOfDayShift(timestamp, wasPositive = true) 294 255 prefsInteractor.setUntrackedRangeStart(newValue) 295 - updateUntrackedRangeViewData() 256 + parent?.updateContent() 296 257 } 297 258 298 259 SettingsViewModel.UNTRACKED_RANGE_END_DIALOG_TAG -> { 299 260 val newValue = settingsMapper.toStartOfDayShift(timestamp, wasPositive = true) 300 261 prefsInteractor.setUntrackedRangeEnd(newValue) 301 - updateUntrackedRangeViewData() 262 + parent?.updateContent() 302 263 } 303 264 } 304 265 } ··· 307 268 router.navigate( 308 269 CardOrderDialogParams(cardOrder), 309 270 ) 310 - } 311 - 312 - private suspend fun updateDaysInCalendarViewData() { 313 - val data = loadDaysInCalendarViewData() 314 - daysInCalendarViewData.set(data) 315 - } 316 - 317 - private suspend fun loadDaysInCalendarViewData(): DaysInCalendarViewData { 318 - return prefsInteractor.getDaysInCalendar() 319 - .let(settingsMapper::toDaysInCalendarViewData) 320 - } 321 - 322 - private suspend fun updateWidgetTransparencyViewData() { 323 - val data = loadWidgetTransparencyViewData() 324 - widgetTransparencyViewData.set(data) 325 - } 326 - 327 - private suspend fun loadWidgetTransparencyViewData(): WidgetTransparencyViewData { 328 - return prefsInteractor.getWidgetBackgroundTransparencyPercent() 329 - .let(::WidgetTransparencyPercent) 330 - .let(settingsMapper::toWidgetTransparencyViewData) 331 - } 332 - 333 - private suspend fun updateCardOrderViewData() { 334 - val data = loadCardOrderViewData() 335 - (cardOrderViewData as MutableLiveData).value = data 336 - } 337 - 338 - private suspend fun loadCardOrderViewData(): CardOrderViewData { 339 - return prefsInteractor.getCardOrder() 340 - .let(settingsMapper::toCardOrderViewData) 341 - } 342 - 343 - private suspend fun updateIgnoreShortUntrackedViewData() { 344 - val data = loadIgnoreShortUntrackedViewData() 345 - ignoreShortUntrackedViewData.set(data) 346 - } 347 - 348 - private suspend fun loadIgnoreShortUntrackedViewData(): String { 349 - return prefsInteractor.getIgnoreShortUntrackedDuration() 350 - .let(settingsMapper::toDurationViewData) 351 - .text 352 - } 353 - 354 - private suspend fun updateUntrackedRangeViewData() { 355 - val data = loadUntrackedRangeViewData() 356 - untrackedRangeViewData.set(data) 357 - } 358 - 359 - private suspend fun loadUntrackedRangeViewData(): SettingsUntrackedRangeViewData { 360 - val enabled = prefsInteractor.getUntrackedRangeEnabled() 361 - 362 - return if (enabled) { 363 - val start = prefsInteractor.getUntrackedRangeStart() 364 - val end = prefsInteractor.getUntrackedRangeEnd() 365 - val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat() 366 - SettingsUntrackedRangeViewData.Enabled( 367 - settingsMapper.toStartOfDayText(start, useMilitaryTime), 368 - settingsMapper.toStartOfDayText(end, useMilitaryTime), 369 - ) 370 - } else { 371 - SettingsUntrackedRangeViewData.Disabled 372 - } 373 - } 374 - 375 - private suspend fun updateUseMilitaryTimeViewData() { 376 - val data = loadUseMilitaryTimeViewData() 377 - useMilitaryTimeHint.set(data) 378 - } 379 - 380 - private suspend fun loadUseMilitaryTimeViewData(): String { 381 - return prefsInteractor.getUseMilitaryTimeFormat() 382 - .let(settingsMapper::toUseMilitaryTimeHint) 383 - } 384 - 385 - private suspend fun updateUseMonthDayTimeViewData() { 386 - val data = loadUseMonthDayTimeViewData() 387 - useMonthDayTimeHint.set(data) 388 - } 389 - 390 - private suspend fun loadUseMonthDayTimeViewData(): String { 391 - return prefsInteractor.getUseMonthDayTimeFormat() 392 - .let(settingsMapper::toUseMonthDayTimeHint) 393 - } 394 - 395 - private suspend fun updateUseProportionalMinutesViewData() { 396 - val data = loadUseProportionalMinutesViewData() 397 - useProportionalMinutesHint.set(data) 398 - } 399 - 400 - private suspend fun loadUseProportionalMinutesViewData(): String { 401 - return prefsInteractor.getUseProportionalMinutes() 402 - .let(settingsMapper::toUseProportionalMinutesHint) 403 271 } 404 272 }
+1 -2
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsNotificationsViewModelDelegate.kt
··· 29 29 private val settingsNotificationsViewDataInteractor: SettingsNotificationsViewDataInteractor, 30 30 ) : ViewModelDelegate() { 31 31 32 + private var parent: SettingsParent? = null 32 33 private var isCollapsed: Boolean = true 33 - 34 - private var parent: SettingsParent? = null 35 34 36 35 fun init(parent: SettingsParent) { 37 36 this.parent = parent
+7 -2
features/feature_settings/src/main/res/layout/item_settings_checkbox.xml
··· 54 54 app:layout_constraintEnd_toEndOf="parent" 55 55 app:layout_constraintTop_toTopOf="@id/tvItemSettingsTitle" /> 56 56 57 + <Space 58 + android:id="@+id/spaceItemSettingsBottom" 59 + android:layout_width="match_parent" 60 + android:layout_height="12dp" 61 + app:layout_constraintTop_toBottomOf="@id/tvItemSettingsSubtitle" /> 62 + 57 63 <View 58 64 android:id="@+id/viewItemSettingsDivider" 59 65 style="@style/SettingsDivider" 60 66 android:layout_width="match_parent" 61 67 android:layout_marginHorizontal="12dp" 62 - android:layout_marginTop="12dp" 63 68 android:translationZ="4dp" 64 - app:layout_constraintTop_toBottomOf="@id/tvItemSettingsSubtitle" /> 69 + app:layout_constraintTop_toBottomOf="@id/spaceItemSettingsBottom" /> 65 70 66 71 </androidx.constraintlayout.widget.ConstraintLayout>
+126
features/feature_settings/src/main/res/layout/item_settings_checkbox_with_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/tvItemSettingsCheckboxWithRangeTitle" 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_constraintEnd_toStartOf="@id/barrierItemSettingsCheckboxWithRange" 27 + app:layout_constraintStart_toStartOf="parent" 28 + app:layout_constraintTop_toTopOf="parent" 29 + tools:text="Title" /> 30 + 31 + <androidx.appcompat.widget.AppCompatTextView 32 + android:id="@+id/tvItemSettingsCheckboxWithRangeSubtitle" 33 + style="@style/SettingsSecondaryText" 34 + android:layout_width="0dp" 35 + android:layout_height="wrap_content" 36 + android:paddingBottom="0dp" 37 + android:translationZ="4dp" 38 + app:layout_constraintEnd_toEndOf="@id/tvItemSettingsCheckboxWithRangeTitle" 39 + app:layout_constraintStart_toStartOf="@id/tvItemSettingsCheckboxWithRangeTitle" 40 + app:layout_constraintTop_toBottomOf="@id/tvItemSettingsCheckboxWithRangeTitle" 41 + tools:text="Subtitle" /> 42 + 43 + <Space 44 + android:id="@+id/spaceItemSettingsCheckboxWithRangeBottom" 45 + android:layout_width="match_parent" 46 + android:layout_height="12dp" 47 + app:layout_constraintTop_toBottomOf="@id/tvItemSettingsCheckboxWithRangeSubtitle" /> 48 + 49 + <View 50 + android:id="@+id/viewItemSettingsDivider" 51 + style="@style/SettingsDivider" 52 + android:layout_width="match_parent" 53 + android:layout_marginHorizontal="12dp" 54 + android:translationZ="4dp" 55 + app:layout_constraintTop_toBottomOf="@id/spaceItemSettingsCheckboxWithRangeBottom" /> 56 + 57 + <androidx.constraintlayout.widget.Barrier 58 + android:id="@+id/barrierItemSettingsCheckboxWithRange" 59 + android:layout_width="wrap_content" 60 + android:layout_height="wrap_content" 61 + app:barrierDirection="start" 62 + app:constraint_referenced_ids="tvItemSettingsCheckboxWithRangeStart, checkboxItemSettingsCheckboxWithRange" /> 63 + 64 + <androidx.appcompat.widget.AppCompatCheckBox 65 + android:id="@+id/checkboxItemSettingsCheckboxWithRange" 66 + android:layout_width="wrap_content" 67 + android:layout_height="0dp" 68 + android:layout_marginEnd="4dp" 69 + android:translationZ="4dp" 70 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsCheckboxWithRangeTitle" 71 + app:layout_constraintEnd_toEndOf="parent" 72 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsCheckboxWithRangeTitle" /> 73 + 74 + <androidx.appcompat.widget.AppCompatTextView 75 + android:id="@+id/tvItemSettingsCheckboxWithRangeStart" 76 + android:layout_width="wrap_content" 77 + android:layout_height="wrap_content" 78 + android:layout_marginTop="8dp" 79 + android:background="?selectableItemBackgroundBorderless" 80 + android:gravity="center" 81 + android:paddingHorizontal="8dp" 82 + android:paddingVertical="4dp" 83 + android:textColor="?appTextPrimaryColor" 84 + android:translationZ="4dp" 85 + app:layout_constraintEnd_toStartOf="@id/tvItemSettingsCheckboxWithRangeDivider" 86 + app:layout_constraintTop_toBottomOf="@id/checkboxItemSettingsCheckboxWithRange" 87 + tools:text="01:23" /> 88 + 89 + <androidx.appcompat.widget.AppCompatTextView 90 + android:id="@+id/tvItemSettingsCheckboxWithRangeDivider" 91 + android:layout_width="wrap_content" 92 + android:layout_height="wrap_content" 93 + android:gravity="end|center_vertical" 94 + android:text="-" 95 + android:textColor="?appTextPrimaryColor" 96 + android:translationZ="4dp" 97 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsCheckboxWithRangeStart" 98 + app:layout_constraintEnd_toStartOf="@id/tvItemSettingsCheckboxWithRangeEnd" 99 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsCheckboxWithRangeStart" 100 + tools:ignore="HardcodedText" /> 101 + 102 + <androidx.appcompat.widget.AppCompatTextView 103 + android:id="@+id/tvItemSettingsCheckboxWithRangeEnd" 104 + android:layout_width="wrap_content" 105 + android:layout_height="match_parent" 106 + android:layout_marginEnd="20dp" 107 + android:background="?selectableItemBackgroundBorderless" 108 + android:gravity="center" 109 + android:paddingHorizontal="8dp" 110 + android:paddingVertical="4dp" 111 + android:textColor="?appTextPrimaryColor" 112 + android:translationZ="4dp" 113 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsCheckboxWithRangeStart" 114 + app:layout_constraintEnd_toEndOf="parent" 115 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsCheckboxWithRangeStart" 116 + tools:text="01:23" /> 117 + 118 + <androidx.constraintlayout.widget.Group 119 + android:id="@+id/groupItemSettingsCheckboxWithRange" 120 + android:layout_width="wrap_content" 121 + android:layout_height="wrap_content" 122 + android:visibility="gone" 123 + app:constraint_referenced_ids="tvItemSettingsCheckboxWithRangeStart, tvItemSettingsCheckboxWithRangeDivider, tvItemSettingsCheckboxWithRangeEnd" 124 + tools:visibility="visible" /> 125 + 126 + </androidx.constraintlayout.widget.ConstraintLayout>
+30
features/feature_settings/src/main/res/layout/item_settings_hint.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="20" 13 + app:layout_constraintBottom_toBottomOf="parent" 14 + app:layout_constraintTop_toTopOf="parent" /> 15 + 16 + <androidx.appcompat.widget.AppCompatTextView 17 + android:id="@+id/tvItemSettingsHint" 18 + style="@style/SettingsSecondaryText" 19 + android:layout_width="match_parent" 20 + android:layout_height="wrap_content" 21 + android:layout_marginHorizontal="4dp" 22 + android:paddingTop="12dp" 23 + android:paddingBottom="0dp" 24 + android:translationZ="4dp" 25 + android:visibility="gone" 26 + app:layout_constraintTop_toTopOf="parent" 27 + tools:text="Subtitle" 28 + tools:visibility="visible" /> 29 + 30 + </androidx.constraintlayout.widget.ConstraintLayout>
+87
features/feature_settings/src/main/res/layout/item_settings_spinner_with_button.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/btnItemSettingsSpinner" 25 + app:layout_constraintStart_toStartOf="parent" 26 + app:layout_constraintTop_toTopOf="parent" 27 + tools:text="Title" /> 28 + 29 + <androidx.cardview.widget.CardView 30 + android:id="@+id/btnItemSettingsSpinner" 31 + style="@style/SettingsCard" 32 + android:layout_width="44dp" 33 + android:layout_height="44dp" 34 + android:foreground="?selectableItemBackground" 35 + android:translationZ="4dp" 36 + android:visibility="gone" 37 + app:cardBackgroundColor="?appButtonOnCardBackgroundColor" 38 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsTitle" 39 + app:layout_constraintDimensionRatio="h,1:1" 40 + app:layout_constraintEnd_toStartOf="@id/tvItemSettingsValue" 41 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsTitle" 42 + tools:visibility="visible"> 43 + 44 + <androidx.appcompat.widget.AppCompatImageView 45 + android:layout_width="match_parent" 46 + android:layout_height="match_parent" 47 + android:scaleType="center" 48 + android:src="@drawable/ic_settings" 49 + android:tint="?appInactiveColor" 50 + tools:ignore="ContentDescription" /> 51 + 52 + </androidx.cardview.widget.CardView> 53 + 54 + <androidx.appcompat.widget.AppCompatTextView 55 + android:id="@+id/tvItemSettingsValue" 56 + android:layout_width="wrap_content" 57 + android:layout_height="0dp" 58 + android:layout_marginEnd="32dp" 59 + android:gravity="end|center_vertical" 60 + android:paddingStart="8dp" 61 + android:paddingEnd="8dp" 62 + android:textColor="?appTextPrimaryColor" 63 + android:translationZ="4dp" 64 + app:layout_constraintBottom_toBottomOf="@id/spinnerItemSettings" 65 + app:layout_constraintEnd_toEndOf="@id/spinnerItemSettings" 66 + app:layout_constraintTop_toTopOf="@id/spinnerItemSettings" 67 + tools:text="@string/settings_dark_mode_system" /> 68 + 69 + <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 70 + android:id="@+id/spinnerItemSettings" 71 + android:layout_width="wrap_content" 72 + android:layout_height="0dp" 73 + android:layout_marginEnd="12dp" 74 + android:translationZ="4dp" 75 + app:layout_constraintBottom_toBottomOf="@id/tvItemSettingsTitle" 76 + app:layout_constraintEnd_toEndOf="parent" 77 + app:layout_constraintTop_toTopOf="@id/tvItemSettingsTitle" /> 78 + 79 + <View 80 + android:id="@+id/viewItemSettingsDivider" 81 + style="@style/SettingsDivider" 82 + android:layout_width="match_parent" 83 + android:layout_marginHorizontal="12dp" 84 + android:translationZ="4dp" 85 + app:layout_constraintTop_toBottomOf="@id/tvItemSettingsTitle" /> 86 + 87 + </androidx.constraintlayout.widget.ConstraintLayout>
-726
features/feature_settings/src/main/res/layout/settings_display_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/layoutSettingsDisplayTitle" 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/tvSettingsDisplayTitle" 24 - style="@style/SettingsText" 25 - android:layout_width="0dp" 26 - android:layout_height="wrap_content" 27 - android:text="@string/settings_display_title" 28 - app:layout_constraintEnd_toStartOf="@id/arrowSettingsDisplay" 29 - app:layout_constraintStart_toStartOf="parent" 30 - app:layout_constraintTop_toTopOf="parent" /> 31 - 32 - <ImageView 33 - android:id="@+id/arrowSettingsDisplay" 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/tvSettingsDisplayTitle" 40 - app:layout_constraintEnd_toEndOf="parent" 41 - app:layout_constraintTop_toTopOf="@id/tvSettingsDisplayTitle" 42 - tools:ignore="ContentDescription" /> 43 - 44 - </androidx.constraintlayout.widget.ConstraintLayout> 45 - 46 - <LinearLayout 47 - android:id="@+id/layoutSettingsDisplayContent" 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 - 62 - <androidx.appcompat.widget.AppCompatTextView 63 - android:id="@+id/tvSettingsUntrackedTimeHint" 64 - style="@style/SettingsSecondaryText" 65 - android:layout_width="0dp" 66 - android:layout_height="wrap_content" 67 - android:paddingTop="12dp" 68 - android:text="@string/change_record_untracked_time_hint" 69 - app:layout_constraintEnd_toEndOf="parent" 70 - app:layout_constraintStart_toStartOf="parent" 71 - app:layout_constraintTop_toTopOf="parent" /> 72 - 73 - <androidx.appcompat.widget.AppCompatTextView 74 - android:id="@+id/tvSettingsShowUntracked" 75 - style="@style/SettingsText" 76 - android:layout_width="0dp" 77 - android:layout_height="wrap_content" 78 - android:paddingTop="0dp" 79 - android:text="@string/settings_show_untracked_time" 80 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsShowUntrackedInRecords" 81 - app:layout_constraintStart_toStartOf="parent" 82 - app:layout_constraintTop_toBottomOf="@+id/tvSettingsUntrackedTimeHint" /> 83 - 84 - <androidx.appcompat.widget.AppCompatCheckBox 85 - android:id="@+id/checkboxSettingsShowUntrackedInRecords" 86 - android:layout_width="wrap_content" 87 - android:layout_height="0dp" 88 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsShowUntracked" 89 - app:layout_constraintEnd_toEndOf="parent" 90 - app:layout_constraintTop_toTopOf="@id/tvSettingsShowUntracked" /> 91 - 92 - </androidx.constraintlayout.widget.ConstraintLayout> 93 - 94 - <androidx.constraintlayout.widget.ConstraintLayout 95 - android:layout_width="match_parent" 96 - android:layout_height="wrap_content"> 97 - 98 - <androidx.appcompat.widget.AppCompatTextView 99 - android:id="@+id/tvSettingsShowUntrackedInStatistics" 100 - style="@style/SettingsText" 101 - android:layout_width="0dp" 102 - android:layout_height="wrap_content" 103 - android:paddingTop="0dp" 104 - android:text="@string/settings_show_untracked_time_statistics" 105 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsShowUntrackedInStatistics" 106 - app:layout_constraintStart_toStartOf="parent" 107 - app:layout_constraintTop_toTopOf="parent" /> 108 - 109 - <androidx.appcompat.widget.AppCompatCheckBox 110 - android:id="@+id/checkboxSettingsShowUntrackedInStatistics" 111 - android:layout_width="wrap_content" 112 - android:layout_height="0dp" 113 - android:layout_marginBottom="12dp" 114 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsShowUntrackedInStatistics" 115 - app:layout_constraintEnd_toEndOf="parent" 116 - app:layout_constraintTop_toTopOf="@id/tvSettingsShowUntrackedInStatistics" /> 117 - 118 - </androidx.constraintlayout.widget.ConstraintLayout> 119 - 120 - <androidx.constraintlayout.widget.ConstraintLayout 121 - android:layout_width="match_parent" 122 - android:layout_height="wrap_content"> 123 - 124 - <androidx.appcompat.widget.AppCompatTextView 125 - android:id="@+id/tvSettingsIgnoreShortUntracked" 126 - style="@style/SettingsText" 127 - android:layout_width="0dp" 128 - android:layout_height="wrap_content" 129 - android:paddingTop="0dp" 130 - android:paddingBottom="0dp" 131 - android:text="@string/settings_ignore_short_untracked" 132 - app:layout_constraintEnd_toStartOf="@id/groupSettingsIgnoreShortUntracked" 133 - app:layout_constraintStart_toStartOf="parent" 134 - app:layout_constraintTop_toTopOf="parent" /> 135 - 136 - <androidx.appcompat.widget.AppCompatTextView 137 - style="@style/SettingsSecondaryText" 138 - android:layout_width="0dp" 139 - android:layout_height="wrap_content" 140 - android:text="@string/settings_ignore_short_untracked_hint" 141 - app:layout_constraintEnd_toStartOf="@id/groupSettingsIgnoreShortUntracked" 142 - app:layout_constraintStart_toStartOf="parent" 143 - app:layout_constraintTop_toBottomOf="@id/tvSettingsIgnoreShortUntracked" /> 144 - 145 - <androidx.appcompat.widget.LinearLayoutCompat 146 - android:id="@+id/groupSettingsIgnoreShortUntracked" 147 - android:layout_width="wrap_content" 148 - android:layout_height="wrap_content" 149 - android:orientation="horizontal" 150 - app:layout_constraintEnd_toEndOf="parent" 151 - app:layout_constraintTop_toTopOf="parent"> 152 - 153 - <androidx.appcompat.widget.AppCompatTextView 154 - android:id="@+id/tvSettingsIgnoreShortUntrackedTime" 155 - android:layout_width="wrap_content" 156 - android:layout_height="match_parent" 157 - android:gravity="end|center_vertical" 158 - android:paddingHorizontal="8dp" 159 - android:textColor="?appTextPrimaryColor" 160 - tools:text="99h 99m 99s" /> 161 - 162 - <androidx.appcompat.widget.AppCompatImageView 163 - android:id="@+id/arrowSettingsIgnoreShortUntracked" 164 - android:layout_width="24dp" 165 - android:layout_height="24dp" 166 - android:layout_marginEnd="16dp" 167 - android:background="?selectableItemBackgroundBorderless" 168 - android:src="?appArrow" 169 - tools:ignore="ContentDescription" /> 170 - 171 - </androidx.appcompat.widget.LinearLayoutCompat> 172 - 173 - </androidx.constraintlayout.widget.ConstraintLayout> 174 - 175 - <androidx.constraintlayout.widget.ConstraintLayout 176 - android:layout_width="match_parent" 177 - android:layout_height="wrap_content"> 178 - 179 - <androidx.appcompat.widget.AppCompatTextView 180 - android:id="@+id/tvSettingsUntrackedRange" 181 - style="@style/SettingsText" 182 - android:layout_width="0dp" 183 - android:layout_height="wrap_content" 184 - android:paddingTop="0dp" 185 - android:paddingBottom="0dp" 186 - android:text="@string/settings_untracked_range" 187 - app:layout_constraintEnd_toStartOf="@id/barrierSettingsUntrackedRange" 188 - app:layout_constraintStart_toStartOf="parent" 189 - app:layout_constraintTop_toTopOf="parent" /> 190 - 191 - <androidx.appcompat.widget.AppCompatTextView 192 - style="@style/SettingsSecondaryText" 193 - android:layout_width="0dp" 194 - android:layout_height="wrap_content" 195 - android:text="@string/settings_untracked_range_hint" 196 - app:layout_constraintEnd_toEndOf="@id/tvSettingsUntrackedRange" 197 - app:layout_constraintStart_toStartOf="@id/tvSettingsUntrackedRange" 198 - app:layout_constraintTop_toBottomOf="@id/tvSettingsUntrackedRange" /> 199 - 200 - <androidx.constraintlayout.widget.Barrier 201 - android:id="@+id/barrierSettingsUntrackedRange" 202 - android:layout_width="wrap_content" 203 - android:layout_height="wrap_content" 204 - app:barrierDirection="start" 205 - app:constraint_referenced_ids="tvSettingsUntrackedRangeStart, checkboxSettingsUntrackedRange" /> 206 - 207 - <androidx.appcompat.widget.AppCompatCheckBox 208 - android:id="@+id/checkboxSettingsUntrackedRange" 209 - android:layout_width="wrap_content" 210 - android:layout_height="0dp" 211 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsUntrackedRange" 212 - app:layout_constraintEnd_toEndOf="parent" 213 - app:layout_constraintTop_toTopOf="@id/tvSettingsUntrackedRange" /> 214 - 215 - <androidx.appcompat.widget.AppCompatTextView 216 - android:id="@+id/tvSettingsUntrackedRangeStart" 217 - android:layout_width="wrap_content" 218 - android:layout_height="wrap_content" 219 - android:layout_marginTop="8dp" 220 - android:background="?selectableItemBackgroundBorderless" 221 - android:gravity="center" 222 - android:paddingHorizontal="8dp" 223 - android:paddingVertical="4dp" 224 - android:textColor="?appTextPrimaryColor" 225 - app:layout_constraintEnd_toStartOf="@id/tvSettingsUntrackedRangeDivider" 226 - app:layout_constraintTop_toBottomOf="@id/checkboxSettingsUntrackedRange" 227 - tools:text="01:23" /> 228 - 229 - <androidx.appcompat.widget.AppCompatTextView 230 - android:id="@+id/tvSettingsUntrackedRangeDivider" 231 - android:layout_width="wrap_content" 232 - android:layout_height="wrap_content" 233 - android:gravity="end|center_vertical" 234 - android:text="-" 235 - android:textColor="?appTextPrimaryColor" 236 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsUntrackedRangeStart" 237 - app:layout_constraintEnd_toStartOf="@id/tvSettingsUntrackedRangeEnd" 238 - app:layout_constraintTop_toTopOf="@id/tvSettingsUntrackedRangeStart" 239 - tools:ignore="HardcodedText" /> 240 - 241 - <androidx.appcompat.widget.AppCompatTextView 242 - android:id="@+id/tvSettingsUntrackedRangeEnd" 243 - android:layout_width="wrap_content" 244 - android:layout_height="match_parent" 245 - android:layout_marginEnd="16dp" 246 - android:background="?selectableItemBackgroundBorderless" 247 - android:gravity="center" 248 - android:paddingHorizontal="8dp" 249 - android:paddingVertical="4dp" 250 - android:textColor="?appTextPrimaryColor" 251 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsUntrackedRangeStart" 252 - app:layout_constraintEnd_toEndOf="parent" 253 - app:layout_constraintTop_toTopOf="@id/tvSettingsUntrackedRangeStart" 254 - tools:text="01:23" /> 255 - 256 - <androidx.constraintlayout.widget.Group 257 - android:id="@+id/groupSettingsUntrackedRange" 258 - android:layout_width="wrap_content" 259 - android:layout_height="wrap_content" 260 - android:visibility="gone" 261 - app:constraint_referenced_ids="tvSettingsUntrackedRangeStart, tvSettingsUntrackedRangeDivider, tvSettingsUntrackedRangeEnd" 262 - tools:visibility="visible" /> 263 - 264 - </androidx.constraintlayout.widget.ConstraintLayout> 265 - 266 - <View 267 - style="@style/SettingsDivider" 268 - android:layout_width="match_parent" /> 269 - 270 - <androidx.constraintlayout.widget.ConstraintLayout 271 - android:layout_width="match_parent" 272 - android:layout_height="wrap_content"> 273 - 274 - <androidx.appcompat.widget.AppCompatTextView 275 - android:id="@+id/tvSettingsShowRecordsCalendar" 276 - style="@style/SettingsText" 277 - android:layout_width="0dp" 278 - android:layout_height="wrap_content" 279 - android:text="@string/settings_show_records_calendar" 280 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsShowRecordsCalendar" 281 - app:layout_constraintStart_toStartOf="parent" 282 - app:layout_constraintTop_toTopOf="parent" /> 283 - 284 - <androidx.appcompat.widget.AppCompatCheckBox 285 - android:id="@+id/checkboxSettingsShowRecordsCalendar" 286 - android:layout_width="wrap_content" 287 - android:layout_height="0dp" 288 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsShowRecordsCalendar" 289 - app:layout_constraintEnd_toEndOf="parent" 290 - app:layout_constraintTop_toTopOf="@id/tvSettingsShowRecordsCalendar" /> 291 - 292 - <androidx.appcompat.widget.AppCompatTextView 293 - android:id="@+id/tvSettingsReverseOrderInCalendarHint" 294 - style="@style/SettingsText" 295 - android:layout_width="0dp" 296 - android:layout_height="wrap_content" 297 - android:text="@string/settings_reverse_order_in_calendar" 298 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsReverseOrderInCalendar" 299 - app:layout_constraintStart_toStartOf="parent" 300 - app:layout_constraintTop_toBottomOf="@id/tvSettingsShowRecordsCalendar" /> 301 - 302 - <androidx.appcompat.widget.AppCompatCheckBox 303 - android:id="@+id/checkboxSettingsReverseOrderInCalendar" 304 - android:layout_width="wrap_content" 305 - android:layout_height="0dp" 306 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsReverseOrderInCalendarHint" 307 - app:layout_constraintEnd_toEndOf="parent" 308 - app:layout_constraintTop_toTopOf="@id/tvSettingsReverseOrderInCalendarHint" /> 309 - 310 - <androidx.constraintlayout.widget.ConstraintLayout 311 - android:id="@+id/containerSettingsDaysInCalendar" 312 - android:layout_width="match_parent" 313 - android:layout_height="wrap_content" 314 - app:layout_constraintBottom_toBottomOf="parent" 315 - app:layout_constraintTop_toBottomOf="@id/tvSettingsReverseOrderInCalendarHint"> 316 - 317 - <androidx.appcompat.widget.AppCompatTextView 318 - android:id="@+id/tvSettingsDaysInCalendar" 319 - style="@style/SettingsText" 320 - android:layout_width="0dp" 321 - android:layout_height="wrap_content" 322 - android:text="@string/settings_days_in_calendar" 323 - app:layout_constraintEnd_toStartOf="@id/tvSettingsDaysInCalendarValue" 324 - app:layout_constraintStart_toStartOf="parent" 325 - app:layout_constraintTop_toTopOf="parent" /> 326 - 327 - <androidx.appcompat.widget.AppCompatTextView 328 - android:id="@+id/tvSettingsDaysInCalendarValue" 329 - android:layout_width="wrap_content" 330 - android:layout_height="0dp" 331 - android:layout_marginEnd="32dp" 332 - android:gravity="end|center_vertical" 333 - android:paddingStart="8dp" 334 - android:paddingEnd="8dp" 335 - android:textColor="?appTextPrimaryColor" 336 - app:layout_constraintBottom_toBottomOf="@id/spinnerSettingsDaysInCalendar" 337 - app:layout_constraintEnd_toEndOf="@id/spinnerSettingsDaysInCalendar" 338 - app:layout_constraintTop_toTopOf="@id/spinnerSettingsDaysInCalendar" 339 - tools:text="7" /> 340 - 341 - <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 342 - android:id="@+id/spinnerSettingsDaysInCalendar" 343 - android:layout_width="wrap_content" 344 - android:layout_height="0dp" 345 - android:layout_marginEnd="8dp" 346 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsDaysInCalendar" 347 - app:layout_constraintEnd_toEndOf="parent" 348 - app:layout_constraintTop_toTopOf="@id/tvSettingsDaysInCalendar" /> 349 - 350 - </androidx.constraintlayout.widget.ConstraintLayout> 351 - 352 - <androidx.constraintlayout.widget.Group 353 - android:id="@+id/groupSettingsReverseOrderInCalendar" 354 - android:layout_width="match_parent" 355 - android:layout_height="match_parent" 356 - android:visibility="gone" 357 - app:constraint_referenced_ids="tvSettingsReverseOrderInCalendarHint, checkboxSettingsReverseOrderInCalendar, containerSettingsDaysInCalendar" 358 - tools:visibility="visible" /> 359 - 360 - </androidx.constraintlayout.widget.ConstraintLayout> 361 - 362 - <View 363 - style="@style/SettingsDivider" 364 - android:layout_width="match_parent" /> 365 - 366 - <androidx.constraintlayout.widget.ConstraintLayout 367 - android:layout_width="match_parent" 368 - android:layout_height="wrap_content"> 369 - 370 - <androidx.appcompat.widget.AppCompatTextView 371 - android:id="@+id/tvSettingsShowActivityFilters" 372 - style="@style/SettingsText" 373 - android:layout_width="0dp" 374 - android:layout_height="wrap_content" 375 - android:text="@string/settings_show_activity_filters" 376 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsShowActivityFilters" 377 - app:layout_constraintStart_toStartOf="parent" 378 - app:layout_constraintTop_toTopOf="parent" /> 379 - 380 - <androidx.appcompat.widget.AppCompatCheckBox 381 - android:id="@+id/checkboxSettingsShowActivityFilters" 382 - android:layout_width="wrap_content" 383 - android:layout_height="0dp" 384 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsShowActivityFilters" 385 - app:layout_constraintEnd_toEndOf="parent" 386 - app:layout_constraintTop_toTopOf="@id/tvSettingsShowActivityFilters" /> 387 - 388 - </androidx.constraintlayout.widget.ConstraintLayout> 389 - 390 - <View 391 - style="@style/SettingsDivider" 392 - android:layout_width="match_parent" /> 393 - 394 - <androidx.constraintlayout.widget.ConstraintLayout 395 - android:layout_width="match_parent" 396 - android:layout_height="wrap_content"> 397 - 398 - <androidx.appcompat.widget.AppCompatTextView 399 - android:id="@+id/tvSettingsShowGoalsSeparately" 400 - style="@style/SettingsText" 401 - android:layout_width="0dp" 402 - android:layout_height="wrap_content" 403 - android:text="@string/settings_show_goals_separately" 404 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsShowGoalsSeparately" 405 - app:layout_constraintStart_toStartOf="parent" 406 - app:layout_constraintTop_toTopOf="parent" /> 407 - 408 - <androidx.appcompat.widget.AppCompatCheckBox 409 - android:id="@+id/checkboxSettingsShowGoalsSeparately" 410 - android:layout_width="wrap_content" 411 - android:layout_height="0dp" 412 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsShowGoalsSeparately" 413 - app:layout_constraintEnd_toEndOf="parent" 414 - app:layout_constraintTop_toTopOf="@id/tvSettingsShowGoalsSeparately" /> 415 - 416 - </androidx.constraintlayout.widget.ConstraintLayout> 417 - 418 - <View 419 - style="@style/SettingsDivider" 420 - android:layout_width="match_parent" /> 421 - 422 - <androidx.constraintlayout.widget.ConstraintLayout 423 - android:layout_width="match_parent" 424 - android:layout_height="wrap_content"> 425 - 426 - <androidx.appcompat.widget.AppCompatTextView 427 - android:id="@+id/tvSettingsKeepScreenOn" 428 - style="@style/SettingsText" 429 - android:layout_width="0dp" 430 - android:layout_height="wrap_content" 431 - android:text="@string/settings_keep_screen_on" 432 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsKeepScreenOn" 433 - app:layout_constraintStart_toStartOf="parent" 434 - app:layout_constraintTop_toTopOf="parent" /> 435 - 436 - <androidx.appcompat.widget.AppCompatCheckBox 437 - android:id="@+id/checkboxSettingsKeepScreenOn" 438 - android:layout_width="wrap_content" 439 - android:layout_height="0dp" 440 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsKeepScreenOn" 441 - app:layout_constraintEnd_toEndOf="parent" 442 - app:layout_constraintTop_toTopOf="@id/tvSettingsKeepScreenOn" /> 443 - 444 - </androidx.constraintlayout.widget.ConstraintLayout> 445 - 446 - <View 447 - style="@style/SettingsDivider" 448 - android:layout_width="match_parent" /> 449 - 450 - <androidx.constraintlayout.widget.ConstraintLayout 451 - android:layout_width="match_parent" 452 - android:layout_height="wrap_content" 453 - app:layout_constraintBottom_toBottomOf="parent"> 454 - 455 - <androidx.appcompat.widget.AppCompatTextView 456 - android:id="@+id/tvSettingsWidgetTransparency" 457 - style="@style/SettingsText" 458 - android:layout_width="0dp" 459 - android:layout_height="wrap_content" 460 - android:text="@string/settings_widget_transparency" 461 - app:layout_constraintEnd_toStartOf="@id/tvSettingsWidgetTransparencyValue" 462 - app:layout_constraintStart_toStartOf="parent" 463 - app:layout_constraintTop_toTopOf="parent" /> 464 - 465 - <androidx.appcompat.widget.AppCompatTextView 466 - android:id="@+id/tvSettingsWidgetTransparencyValue" 467 - android:layout_width="wrap_content" 468 - android:layout_height="0dp" 469 - android:layout_marginEnd="32dp" 470 - android:gravity="end|center_vertical" 471 - android:paddingStart="8dp" 472 - android:paddingEnd="8dp" 473 - android:textColor="?appTextPrimaryColor" 474 - app:layout_constraintBottom_toBottomOf="@id/spinnerSettingsWidgetTransparency" 475 - app:layout_constraintEnd_toEndOf="@id/spinnerSettingsWidgetTransparency" 476 - app:layout_constraintTop_toTopOf="@id/spinnerSettingsWidgetTransparency" 477 - tools:text="50%" /> 478 - 479 - <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 480 - android:id="@+id/spinnerSettingsWidgetTransparency" 481 - android:layout_width="wrap_content" 482 - android:layout_height="0dp" 483 - android:layout_marginEnd="8dp" 484 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsWidgetTransparency" 485 - app:layout_constraintEnd_toEndOf="parent" 486 - app:layout_constraintTop_toTopOf="@id/tvSettingsWidgetTransparency" /> 487 - 488 - </androidx.constraintlayout.widget.ConstraintLayout> 489 - 490 - <View 491 - style="@style/SettingsDivider" 492 - android:layout_width="match_parent" /> 493 - 494 - <androidx.constraintlayout.widget.ConstraintLayout 495 - android:layout_width="match_parent" 496 - android:layout_height="wrap_content" 497 - android:paddingTop="12dp"> 498 - 499 - <androidx.appcompat.widget.AppCompatTextView 500 - android:id="@+id/tvSettingsUseMilitaryTime" 501 - style="@style/SettingsText" 502 - android:layout_width="0dp" 503 - android:layout_height="wrap_content" 504 - android:paddingTop="0dp" 505 - android:paddingBottom="0dp" 506 - android:text="@string/settings_use_military_time" 507 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsUseMilitaryTime" 508 - app:layout_constraintStart_toStartOf="parent" 509 - app:layout_constraintTop_toTopOf="parent" /> 510 - 511 - <androidx.appcompat.widget.AppCompatTextView 512 - android:id="@+id/tvSettingsUseMilitaryTimeHint" 513 - style="@style/SettingsSecondaryText" 514 - android:layout_width="0dp" 515 - android:layout_height="wrap_content" 516 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsUseMilitaryTime" 517 - app:layout_constraintStart_toStartOf="parent" 518 - app:layout_constraintTop_toBottomOf="@id/tvSettingsUseMilitaryTime" 519 - tools:text="1:00 PM" /> 520 - 521 - <androidx.appcompat.widget.AppCompatCheckBox 522 - android:id="@+id/checkboxSettingsUseMilitaryTime" 523 - android:layout_width="wrap_content" 524 - android:layout_height="0dp" 525 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsUseMilitaryTime" 526 - app:layout_constraintEnd_toEndOf="parent" 527 - app:layout_constraintTop_toTopOf="@id/tvSettingsUseMilitaryTime" /> 528 - 529 - </androidx.constraintlayout.widget.ConstraintLayout> 530 - 531 - <View 532 - style="@style/SettingsDivider" 533 - android:layout_width="match_parent" /> 534 - 535 - <androidx.constraintlayout.widget.ConstraintLayout 536 - android:layout_width="match_parent" 537 - android:layout_height="wrap_content" 538 - android:paddingTop="12dp"> 539 - 540 - <androidx.appcompat.widget.AppCompatTextView 541 - android:id="@+id/tvSettingsUseMonthDayTime" 542 - style="@style/SettingsText" 543 - android:layout_width="0dp" 544 - android:layout_height="wrap_content" 545 - android:paddingTop="0dp" 546 - android:paddingBottom="0dp" 547 - android:text="@string/settings_use_monthday_time" 548 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsUseMonthDayTime" 549 - app:layout_constraintStart_toStartOf="parent" 550 - app:layout_constraintTop_toTopOf="parent" /> 551 - 552 - <androidx.appcompat.widget.AppCompatTextView 553 - android:id="@+id/tvSettingsUseMonthDayTimeHint" 554 - style="@style/SettingsSecondaryText" 555 - android:layout_width="0dp" 556 - android:layout_height="wrap_content" 557 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsUseMonthDayTime" 558 - app:layout_constraintStart_toStartOf="parent" 559 - app:layout_constraintTop_toBottomOf="@id/tvSettingsUseMonthDayTime" 560 - tools:text="13.07" /> 561 - 562 - <androidx.appcompat.widget.AppCompatCheckBox 563 - android:id="@+id/checkboxSettingsUseMonthDayTime" 564 - android:layout_width="wrap_content" 565 - android:layout_height="0dp" 566 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsUseMonthDayTime" 567 - app:layout_constraintEnd_toEndOf="parent" 568 - app:layout_constraintTop_toTopOf="@id/tvSettingsUseMonthDayTime" /> 569 - 570 - </androidx.constraintlayout.widget.ConstraintLayout> 571 - 572 - <View 573 - style="@style/SettingsDivider" 574 - android:layout_width="match_parent" /> 575 - 576 - <androidx.constraintlayout.widget.ConstraintLayout 577 - android:layout_width="match_parent" 578 - android:layout_height="wrap_content" 579 - android:paddingTop="12dp"> 580 - 581 - <androidx.appcompat.widget.AppCompatTextView 582 - android:id="@+id/tvSettingsUseProportionalMinutes" 583 - style="@style/SettingsText" 584 - android:layout_width="0dp" 585 - android:layout_height="wrap_content" 586 - android:paddingTop="0dp" 587 - android:paddingBottom="0dp" 588 - android:text="@string/settings_use_proportional_minutes" 589 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsUseProportionalMinutes" 590 - app:layout_constraintStart_toStartOf="parent" 591 - app:layout_constraintTop_toTopOf="parent" /> 592 - 593 - <androidx.appcompat.widget.AppCompatTextView 594 - android:id="@+id/tvSettingsUseProportionalMinutesHint" 595 - style="@style/SettingsSecondaryText" 596 - android:layout_width="0dp" 597 - android:layout_height="wrap_content" 598 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsUseProportionalMinutes" 599 - app:layout_constraintStart_toStartOf="parent" 600 - app:layout_constraintTop_toBottomOf="@id/tvSettingsUseProportionalMinutes" 601 - tools:text="1.5 hr" /> 602 - 603 - <androidx.appcompat.widget.AppCompatCheckBox 604 - android:id="@+id/checkboxSettingsUseProportionalMinutes" 605 - android:layout_width="wrap_content" 606 - android:layout_height="0dp" 607 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsUseProportionalMinutes" 608 - app:layout_constraintEnd_toEndOf="parent" 609 - app:layout_constraintTop_toTopOf="@id/tvSettingsUseProportionalMinutes" /> 610 - 611 - </androidx.constraintlayout.widget.ConstraintLayout> 612 - 613 - <View 614 - style="@style/SettingsDivider" 615 - android:layout_width="match_parent" /> 616 - 617 - <androidx.constraintlayout.widget.ConstraintLayout 618 - android:layout_width="match_parent" 619 - android:layout_height="wrap_content"> 620 - 621 - <androidx.appcompat.widget.AppCompatTextView 622 - android:id="@+id/tvSettingsShowSeconds" 623 - style="@style/SettingsText" 624 - android:layout_width="0dp" 625 - android:layout_height="wrap_content" 626 - android:text="@string/settings_show_seconds" 627 - app:layout_constraintEnd_toStartOf="@id/checkboxSettingsShowSeconds" 628 - app:layout_constraintStart_toStartOf="parent" 629 - app:layout_constraintTop_toTopOf="parent" /> 630 - 631 - <androidx.appcompat.widget.AppCompatCheckBox 632 - android:id="@+id/checkboxSettingsShowSeconds" 633 - android:layout_width="wrap_content" 634 - android:layout_height="0dp" 635 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsShowSeconds" 636 - app:layout_constraintEnd_toEndOf="parent" 637 - app:layout_constraintTop_toTopOf="@id/tvSettingsShowSeconds" /> 638 - 639 - </androidx.constraintlayout.widget.ConstraintLayout> 640 - 641 - <View 642 - style="@style/SettingsDivider" 643 - android:layout_width="match_parent" /> 644 - 645 - <androidx.constraintlayout.widget.ConstraintLayout 646 - android:layout_width="match_parent" 647 - android:layout_height="wrap_content"> 648 - 649 - <androidx.appcompat.widget.AppCompatTextView 650 - android:id="@+id/tvSettingsRecordTypeSort" 651 - style="@style/SettingsText" 652 - android:layout_width="0dp" 653 - android:layout_height="wrap_content" 654 - android:text="@string/settings_sort_order" 655 - app:layout_constraintEnd_toStartOf="@id/btnCardOrderManual" 656 - app:layout_constraintStart_toStartOf="parent" 657 - app:layout_constraintTop_toTopOf="parent" /> 658 - 659 - <androidx.cardview.widget.CardView 660 - android:id="@+id/btnCardOrderManual" 661 - style="@style/SettingsCard" 662 - android:layout_width="44dp" 663 - android:layout_height="44dp" 664 - android:foreground="?selectableItemBackground" 665 - android:visibility="gone" 666 - app:cardBackgroundColor="?appButtonOnCardBackgroundColor" 667 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsRecordTypeSort" 668 - app:layout_constraintDimensionRatio="h,1:1" 669 - app:layout_constraintEnd_toStartOf="@id/tvSettingsRecordTypeSortValue" 670 - app:layout_constraintTop_toTopOf="@id/tvSettingsRecordTypeSort" 671 - tools:visibility="visible"> 672 - 673 - <androidx.appcompat.widget.AppCompatImageView 674 - android:layout_width="match_parent" 675 - android:layout_height="match_parent" 676 - android:scaleType="center" 677 - android:src="@drawable/ic_settings" 678 - android:tint="?appInactiveColor" 679 - tools:ignore="ContentDescription" /> 680 - 681 - </androidx.cardview.widget.CardView> 682 - 683 - <androidx.appcompat.widget.AppCompatTextView 684 - android:id="@+id/tvSettingsRecordTypeSortValue" 685 - android:layout_width="wrap_content" 686 - android:layout_height="0dp" 687 - android:layout_marginEnd="32dp" 688 - android:gravity="end|center_vertical" 689 - android:paddingStart="8dp" 690 - android:paddingEnd="8dp" 691 - android:textColor="?appTextPrimaryColor" 692 - app:layout_constraintBottom_toBottomOf="@id/spinnerSettingsRecordTypeSort" 693 - app:layout_constraintEnd_toEndOf="@id/spinnerSettingsRecordTypeSort" 694 - app:layout_constraintTop_toTopOf="@id/spinnerSettingsRecordTypeSort" 695 - tools:text="@string/settings_sort_manually" /> 696 - 697 - <com.example.util.simpletimetracker.feature_views.spinner.CustomSpinner 698 - android:id="@+id/spinnerSettingsRecordTypeSort" 699 - android:layout_width="wrap_content" 700 - android:layout_height="0dp" 701 - android:layout_marginEnd="8dp" 702 - app:layout_constraintBottom_toBottomOf="@id/tvSettingsRecordTypeSort" 703 - app:layout_constraintEnd_toEndOf="parent" 704 - app:layout_constraintTop_toTopOf="@id/tvSettingsRecordTypeSort" /> 705 - 706 - </androidx.constraintlayout.widget.ConstraintLayout> 707 - 708 - <View 709 - style="@style/SettingsDivider" 710 - android:layout_width="match_parent" /> 711 - 712 - <androidx.appcompat.widget.AppCompatTextView 713 - android:id="@+id/tvSettingsChangeCardSize" 714 - style="@style/SettingsText" 715 - android:layout_width="match_parent" 716 - android:layout_height="wrap_content" 717 - android:background="?selectableItemBackground" 718 - android:clickable="true" 719 - android:focusable="true" 720 - android:text="@string/settings_change_card_size" /> 721 - 722 - </LinearLayout> 723 - 724 - </androidx.appcompat.widget.LinearLayoutCompat> 725 - 726 - </androidx.cardview.widget.CardView>
-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/layoutSettingsDisplay" 27 - layout="@layout/settings_display_layout" /> 28 - 29 - <include 30 26 android:id="@+id/layoutSettingsAdditional" 31 27 layout="@layout/settings_additional_layout" /> 32 28