@@ -8,13 +8,15 @@ import com.example.util.simpletimetracker.core.mapper.RecordTagViewDataMapper
88import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper
99import com.example.util.simpletimetracker.core.repo.ResourceRepo
1010import com.example.util.simpletimetracker.domain.base.REPEAT_BUTTON_ITEM_ID
11+ import com.example.util.simpletimetracker.domain.recordTag.interactor.GetSelectableTagsInteractor
1112import com.example.util.simpletimetracker.domain.recordTag.model.RecordTag
1213import com.example.util.simpletimetracker.domain.recordType.model.RecordType
1314import com.example.util.simpletimetracker.domain.recordType.model.RecordTypeGoal
1415import com.example.util.simpletimetracker.feature_notification.R
1516import com.example.util.simpletimetracker.feature_notification.activitySwitch.manager.NotificationControlsManager.Companion.TAGS_LIST_SIZE
1617import com.example.util.simpletimetracker.feature_notification.activitySwitch.manager.NotificationControlsManager.Companion.TYPES_LIST_SIZE
1718import com.example.util.simpletimetracker.feature_notification.activitySwitch.manager.NotificationControlsParams
19+ import com.example.util.simpletimetracker.feature_notification.core.TAG_VALUE_DECIMAL_DELIMITER
1820import com.example.util.simpletimetracker.feature_views.GoalCheckmarkView
1921import com.example.util.simpletimetracker.feature_views.viewData.RecordTypeIcon
2022import javax.inject.Inject
@@ -26,34 +28,69 @@ class GetNotificationActivitySwitchControlsInteractor @Inject constructor(
2628 private val resourceRepo : ResourceRepo ,
2729 private val recordTagViewDataMapper : RecordTagViewDataMapper ,
2830 private val completeTypesStateInteractor : CompleteTypesStateInteractor ,
31+ private val getSelectableTagsInteractor : GetSelectableTagsInteractor ,
2932) {
3033
31- fun getControls (
34+ suspend fun getControls (
35+ hint : String ,
36+ isDarkTheme : Boolean ,
37+ types : List <RecordType >,
38+ suggestions : List <RecordType >,
39+ showRepeatButton : Boolean ,
40+ typesShift : Int ,
41+ tagsShift : Int ,
42+ selectedTypeId : Long? ,
43+ selectedTagId : Long? ,
44+ selectedTagValue : String? ,
45+ goals : Map <Long , List <RecordTypeGoal >>,
46+ allDailyCurrents : Map <Long , GetCurrentRecordsDurationInteractor .Result >,
47+ ): NotificationControlsParams {
48+ val viewState = if (selectedTagId != null && selectedTagId != 0L ) {
49+ mapTagSelectionViewState(
50+ isDarkTheme = isDarkTheme,
51+ currentValueString = selectedTagValue,
52+ )
53+ } else {
54+ mapTypesViewState(
55+ hint = hint,
56+ isDarkTheme = isDarkTheme,
57+ types = types,
58+ suggestions = suggestions,
59+ showRepeatButton = showRepeatButton,
60+ typesShift = typesShift,
61+ selectedTypeId = selectedTypeId,
62+ goals = goals,
63+ allDailyCurrents = allDailyCurrents,
64+ )
65+ }
66+
67+ return NotificationControlsParams .Enabled (
68+ typesShift = typesShift,
69+ tagsShift = tagsShift,
70+ controlIconColor = colorMapper.toInactiveColor(isDarkTheme),
71+ selectedTypeId = selectedTypeId,
72+ selectedTagId = selectedTagId,
73+ selectedTagValue = selectedTagValue,
74+ viewState = viewState,
75+ )
76+ }
77+
78+ private suspend fun mapTypesViewState (
3279 hint : String ,
3380 isDarkTheme : Boolean ,
3481 types : List <RecordType >,
3582 suggestions : List <RecordType >,
3683 showRepeatButton : Boolean ,
3784 typesShift : Int = 0,
38- tags : List <RecordTag > = emptyList(),
39- tagsShift : Int = 0,
4085 selectedTypeId : Long? = null,
41- selectedTagId : Long? = null,
42- autoCancel : Boolean = false,
4386 goals : Map <Long , List <RecordTypeGoal >>,
4487 allDailyCurrents : Map <Long , GetCurrentRecordsDurationInteractor .Result >,
45- ): NotificationControlsParams {
46- // Populate container with empty items to preserve prev next controls position.
47- fun <T > populateWithEmpty (
48- data : List <T >,
49- pageSize : Int ,
50- emptyValueProducer : () -> T ,
51- ): List <T > {
52- if (data.isEmpty()) return data
53- if (data.size % pageSize == 0 ) return data
54- val emptyCount = pageSize - (data.size % pageSize)
55- val emptyData = List (emptyCount) { emptyValueProducer() }
56- return data + emptyData
88+ ): NotificationControlsParams .ViewState {
89+ val tags = if (selectedTypeId != null && selectedTypeId != 0L ) {
90+ getSelectableTagsInteractor.execute(selectedTypeId)
91+ .filterNot { it.archived }
92+ } else {
93+ emptyList()
5794 }
5895
5996 val typesMap = types.associateBy { it.id }
@@ -121,25 +158,71 @@ class GetNotificationActivitySwitchControlsInteractor @Inject constructor(
121158 } else {
122159 " "
123160 }
124-
125- return NotificationControlsParams .Enabled (
126- hint = hint,
127- pagesHint = pagesHint,
161+ val fullHint = if (hint.isNotEmpty()) {
162+ " $hint $pagesHint "
163+ } else {
164+ pagesHint
165+ }
166+ return NotificationControlsParams .ViewState .TypeSelection (
167+ hint = fullHint,
128168 types = allTypesViewData,
129- typesShift = typesShift,
130169 tags = populateWithEmpty(
131170 data = tagsViewData,
132171 pageSize = TAGS_LIST_SIZE ,
133172 emptyValueProducer = { NotificationControlsParams .Tag .Empty },
134173 ),
135- tagsShift = tagsShift,
136174 controlIconPrev = RecordTypeIcon .Image (R .drawable.arrow_left),
137175 controlIconNext = RecordTypeIcon .Image (R .drawable.arrow_right),
138- controlIconColor = colorMapper.toInactiveColor(isDarkTheme),
139176 filteredTypeColor = colorMapper.toInactiveColor(isDarkTheme),
140- selectedTypeId = selectedTypeId,
141- selectedTagId = selectedTagId,
142- autoCancel = autoCancel,
177+ )
178+ }
179+
180+ private fun mapTagSelectionViewState (
181+ isDarkTheme : Boolean ,
182+ currentValueString : String? ,
183+ ): NotificationControlsParams .ViewState {
184+ val hint = if (currentValueString.isNullOrEmpty()) {
185+ resourceRepo.getString(R .string.change_record_type_value_selection_hint)
186+ } else {
187+ currentValueString // TODO TAG add suffix
188+ }
189+
190+ val controlIconColor = colorMapper.toInactiveColor(isDarkTheme)
191+
192+ val numbers = (0 .. 9 ).map { number ->
193+ NotificationControlsParams .TagValueControls .Present (
194+ type = NotificationControlsParams .TagValueControls .Present .Type .Number (number),
195+ text = number.toString(),
196+ color = controlIconColor,
197+ )
198+ }.plus(
199+ NotificationControlsParams .TagValueControls .Present (
200+ type = NotificationControlsParams .TagValueControls .Present .Type .DoubleZero ,
201+ text = " 00" ,
202+ color = controlIconColor,
203+ ),
204+ ).plus(
205+ NotificationControlsParams .TagValueControls .Present (
206+ type = NotificationControlsParams .TagValueControls .Present .Type .Dot ,
207+ text = TAG_VALUE_DECIMAL_DELIMITER .toString(),
208+ color = controlIconColor,
209+ ),
210+ ).let {
211+ populateWithEmpty(
212+ data = it,
213+ pageSize = 12 ,
214+ emptyValueProducer = { NotificationControlsParams .TagValueControls .Empty },
215+ )
216+ }
217+
218+ return NotificationControlsParams .ViewState .TagValueSelection (
219+ hint = hint,
220+ numbers = numbers,
221+ controlIconBack = RecordTypeIcon .Image (R .drawable.record_type_check_cross),
222+ controlBackColor = resourceRepo.getThemedAttr(R .attr.appNegativeColor, isDarkTheme),
223+ controlIconSave = RecordTypeIcon .Image (R .drawable.record_type_check_mark),
224+ controlSaveColor = resourceRepo.getThemedAttr(R .attr.appPositiveColor, isDarkTheme),
225+ controlIconRemove = RecordTypeIcon .Image (R .drawable.backspace),
143226 )
144227 }
145228
@@ -202,4 +285,17 @@ class GetNotificationActivitySwitchControlsInteractor @Inject constructor(
202285 color = colorMapper.toUntrackedColor(isDarkTheme),
203286 ).let (::listOf)
204287 }
288+
289+ // Populate container with empty items to preserve prev next controls position.
290+ private fun <T > populateWithEmpty (
291+ data : List <T >,
292+ pageSize : Int ,
293+ emptyValueProducer : () -> T ,
294+ ): List <T > {
295+ if (data.isEmpty()) return data
296+ if (data.size % pageSize == 0 ) return data
297+ val emptyCount = pageSize - (data.size % pageSize)
298+ val emptyData = List (emptyCount) { emptyValueProducer() }
299+ return data + emptyData
300+ }
205301}
0 commit comments