Skip to content

Commit 437cfe1

Browse files
committed
add setting to hide repeat button, also show pomodoro by default
1 parent 1f6b2e9 commit 437cfe1

File tree

12 files changed

+132
-79
lines changed

12 files changed

+132
-79
lines changed

core/src/main/java/com/example/util/simpletimetracker/core/interactor/RecordRepeatInteractor.kt

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,6 @@ class RecordRepeatInteractor @Inject constructor(
2121
private val resourceRepo: ResourceRepo,
2222
) {
2323

24-
suspend fun shouldShowButton(): Boolean {
25-
return !recordInteractor.isEmpty()
26-
}
27-
2824
suspend fun repeat(): Boolean {
2925
return execute { messageResId ->
3026
SnackBarParams(

core/src/main/java/com/example/util/simpletimetracker/core/viewData/SettingsBlock.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ enum class SettingsBlock {
4747
DisplayShowActivityFilters,
4848
DisplayAllowMultipleActivityFilters,
4949
DisplayEnablePomodoroMode,
50+
DisplayEnableRepeatButton,
51+
DisplayRepeatButtonMode,
5052
DisplayPomodoroModeActivities,
5153
DisplayGoalsOnSeparateTabs,
5254
DisplayNavBarAtTheBottom,
@@ -70,7 +72,6 @@ enum class SettingsBlock {
7072
AdditionalCloseAfterOneTag,
7173
AdditionalKeepStatisticsRange,
7274
AdditionalFirstDayOfWeek,
73-
AdditionalRepeatButton,
7475
AdditionalShiftStartOfDay,
7576
AdditionalShiftStartOfDayButton,
7677
AdditionalShiftStartOfDayHint,

data_local/src/main/java/com/example/util/simpletimetracker/data_local/repo/PrefsRepoImpl.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,12 @@ class PrefsRepoImpl @Inject constructor(
118118
KEY_SHOW_ACTIVITY_FILTERS, false,
119119
)
120120

121+
override var enableRepeatButton: Boolean by prefs.delegate(
122+
KEY_ENABLE_REPEAT_BUTTON, true,
123+
)
124+
121125
override var enablePomodoroMode: Boolean by prefs.delegate(
122-
KEY_ENABLE_POMODORO_MODE, false,
126+
KEY_ENABLE_POMODORO_MODE, true,
123127
)
124128

125129
override var pomodoroModeStartedTimestamp: Long by prefs.delegate(
@@ -542,6 +546,7 @@ class PrefsRepoImpl @Inject constructor(
542546
private const val KEY_REVERSE_ORDER_IN_CALENDAR = "reverseOrderInCalendar"
543547
private const val KEY_DAYS_IN_CALENDAR = "daysInCalendar"
544548
private const val KEY_SHOW_ACTIVITY_FILTERS = "showActivityFilters"
549+
private const val KEY_ENABLE_REPEAT_BUTTON = "enableRepeatButton"
545550
private const val KEY_ENABLE_POMODORO_MODE = "enablePomodoroMode"
546551
private const val KEY_POMODORO_MODE_STARTED_TIMESTAMP = "pomodoroModeStartedTimestamp"
547552
private const val KEY_POMODORO_FOCUS_TIME = "pomodoroFocusTime"

domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/PrefsInteractor.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,14 @@ class PrefsInteractor @Inject constructor(
233233
prefsRepo.showActivityFilters = isEnabled
234234
}
235235

236+
suspend fun getEnableRepeatButton(): Boolean = withContext(Dispatchers.IO) {
237+
prefsRepo.enableRepeatButton
238+
}
239+
240+
suspend fun setEnableRepeatButton(isEnabled: Boolean) = withContext(Dispatchers.IO) {
241+
prefsRepo.enableRepeatButton = isEnabled
242+
}
243+
236244
suspend fun getEnablePomodoroMode(): Boolean = withContext(Dispatchers.IO) {
237245
prefsRepo.enablePomodoroMode
238246
}

domain/src/main/java/com/example/util/simpletimetracker/domain/repo/PrefsRepo.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ interface PrefsRepo {
4545

4646
var showActivityFilters: Boolean
4747

48+
var enableRepeatButton: Boolean
49+
4850
var enablePomodoroMode: Boolean
4951

5052
var pomodoroModeStartedTimestamp: Long // in milliseconds, 0 - disabled

features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/recordType/interactor/NotificationTypeInteractorImpl.kt

Lines changed: 62 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class NotificationTypeInteractorImpl @Inject constructor(
6666
val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat()
6767
val showSeconds = prefsInteractor.getShowSeconds()
6868
val showControls = prefsInteractor.getShowNotificationsControls()
69+
val showRepeatButton = prefsInteractor.getEnableRepeatButton()
6970
val firstDayOfWeek = prefsInteractor.getFirstDayOfWeek()
7071
val startOfDayShift = prefsInteractor.getStartOfDayShift()
7172
val range = timeMapper.getRangeStartAndEnd(
@@ -109,6 +110,7 @@ class NotificationTypeInteractorImpl @Inject constructor(
109110
getControls(
110111
isDarkTheme = isDarkTheme,
111112
types = recordTypes.values.toList(),
113+
showRepeatButton = showRepeatButton,
112114
typesShift = typesShift,
113115
tags = viewedTags,
114116
tagsShift = tagsShift,
@@ -155,6 +157,7 @@ class NotificationTypeInteractorImpl @Inject constructor(
155157
val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat()
156158
val showSeconds = prefsInteractor.getShowSeconds()
157159
val showControls = prefsInteractor.getShowNotificationsControls()
160+
val showRepeatButton = prefsInteractor.getEnableRepeatButton()
158161
val goals = filterGoalsByDayOfWeekInteractor
159162
.execute(recordTypeGoalInteractor.getAllTypeGoals())
160163
.groupBy { it.idData.value }
@@ -171,6 +174,7 @@ class NotificationTypeInteractorImpl @Inject constructor(
171174
getControls(
172175
isDarkTheme = isDarkTheme,
173176
types = recordTypes.values.toList(),
177+
showRepeatButton = showRepeatButton,
174178
goals = goals,
175179
allDailyCurrents = allDailyCurrents,
176180
)
@@ -248,6 +252,7 @@ class NotificationTypeInteractorImpl @Inject constructor(
248252
private fun getControls(
249253
isDarkTheme: Boolean,
250254
types: List<RecordType>,
255+
showRepeatButton: Boolean,
251256
typesShift: Int = 0,
252257
tags: List<RecordTag> = emptyList(),
253258
tagsShift: Int = 0,
@@ -256,57 +261,65 @@ class NotificationTypeInteractorImpl @Inject constructor(
256261
allDailyCurrents: Map<Long, GetCurrentRecordsDurationInteractor.Result>,
257262
): NotificationTypeParams.Controls {
258263
val typesMap = types.associateBy { it.id }
259-
return NotificationTypeParams.Controls.Enabled(
260-
types = run {
261-
val viewData = recordTypeViewDataMapper.mapToRepeatItem(
262-
numberOfCards = 0,
263-
isDarkTheme = isDarkTheme,
264-
)
264+
265+
val repeatButtonViewData = if (showRepeatButton) {
266+
val viewData = recordTypeViewDataMapper.mapToRepeatItem(
267+
numberOfCards = 0,
268+
isDarkTheme = isDarkTheme,
269+
)
270+
NotificationTypeParams.Type(
271+
id = REPEAT_BUTTON_ITEM_ID,
272+
icon = viewData.iconId,
273+
color = viewData.color,
274+
isChecked = null,
275+
).let(::listOf)
276+
} else {
277+
emptyList()
278+
}
279+
280+
val typesViewData = types
281+
.filter { !it.hidden }
282+
.map { type ->
265283
NotificationTypeParams.Type(
266-
id = REPEAT_BUTTON_ITEM_ID,
267-
icon = viewData.iconId,
268-
color = viewData.color,
269-
isChecked = null,
270-
).let(::listOf)
271-
} + types
272-
.filter { !it.hidden }
273-
.map { type ->
274-
NotificationTypeParams.Type(
275-
id = type.id,
276-
icon = type.icon.let(iconMapper::mapIcon),
277-
color = type.color.let { colorMapper.mapToColorInt(it, isDarkTheme) },
278-
isChecked = recordTypeViewDataMapper.mapGoalCheckmark(
279-
type = type,
280-
goals = goals,
281-
allDailyCurrents = allDailyCurrents,
282-
),
283-
)
284-
},
285-
typesShift = typesShift,
286-
tags = tags
287-
.filter { !it.archived }
288-
.map { tag ->
289-
NotificationTypeParams.Tag(
290-
id = tag.id,
291-
text = tag.name,
292-
color = recordTagViewDataMapper.mapColor(
293-
tag = tag,
294-
types = typesMap,
295-
).let { colorMapper.mapToColorInt(it, isDarkTheme) },
296-
)
284+
id = type.id,
285+
icon = type.icon.let(iconMapper::mapIcon),
286+
color = type.color.let { colorMapper.mapToColorInt(it, isDarkTheme) },
287+
isChecked = recordTypeViewDataMapper.mapGoalCheckmark(
288+
type = type,
289+
goals = goals,
290+
allDailyCurrents = allDailyCurrents,
291+
),
292+
)
293+
}
294+
295+
val tagsViewData = tags
296+
.filter { !it.archived }
297+
.map { tag ->
298+
NotificationTypeParams.Tag(
299+
id = tag.id,
300+
text = tag.name,
301+
color = recordTagViewDataMapper.mapColor(
302+
tag = tag,
303+
types = typesMap,
304+
).let { colorMapper.mapToColorInt(it, isDarkTheme) },
305+
)
306+
}
307+
.let {
308+
if (it.isNotEmpty()) {
309+
val untagged = NotificationTypeParams.Tag(
310+
id = 0L,
311+
text = R.string.change_record_untagged.let(resourceRepo::getString),
312+
color = colorMapper.toUntrackedColor(isDarkTheme),
313+
).let(::listOf)
314+
untagged + it
315+
} else {
316+
it
297317
}
298-
.let {
299-
if (it.isNotEmpty()) {
300-
val untagged = NotificationTypeParams.Tag(
301-
id = 0L,
302-
text = R.string.change_record_untagged.let(resourceRepo::getString),
303-
color = colorMapper.toUntrackedColor(isDarkTheme),
304-
).let(::listOf)
305-
untagged + it
306-
} else {
307-
it
308-
}
309-
},
318+
}
319+
return NotificationTypeParams.Controls.Enabled(
320+
types = repeatButtonViewData + typesViewData,
321+
typesShift = typesShift,
322+
tags = tagsViewData,
310323
tagsShift = tagsShift,
311324
controlIconPrev = RecordTypeIcon.Image(R.drawable.arrow_left),
312325
controlIconNext = RecordTypeIcon.Image(R.drawable.arrow_right),

features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/interactor/RunningRecordsViewDataInteractor.kt

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import com.example.util.simpletimetracker.core.interactor.ActivityFilterViewData
44
import com.example.util.simpletimetracker.core.interactor.FilterGoalsByDayOfWeekInteractor
55
import com.example.util.simpletimetracker.core.interactor.GetCurrentRecordsDurationInteractor
66
import com.example.util.simpletimetracker.core.interactor.GetRunningRecordViewDataMediator
7-
import com.example.util.simpletimetracker.core.interactor.RecordRepeatInteractor
87
import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper
98
import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor
9+
import com.example.util.simpletimetracker.domain.interactor.RecordInteractor
1010
import com.example.util.simpletimetracker.domain.interactor.RecordTagInteractor
1111
import com.example.util.simpletimetracker.domain.interactor.RecordTypeGoalInteractor
1212
import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor
@@ -23,7 +23,7 @@ class RunningRecordsViewDataInteractor @Inject constructor(
2323
private val recordTypeInteractor: RecordTypeInteractor,
2424
private val recordTagInteractor: RecordTagInteractor,
2525
private val recordTypeGoalInteractor: RecordTypeGoalInteractor,
26-
private val recordRepeatInteractor: RecordRepeatInteractor,
26+
private val recordInteractor: RecordInteractor,
2727
private val runningRecordInteractor: RunningRecordInteractor,
2828
private val activityFilterViewDataInteractor: ActivityFilterViewDataInteractor,
2929
private val mapper: RunningRecordsViewDataMapper,
@@ -46,8 +46,9 @@ class RunningRecordsViewDataInteractor @Inject constructor(
4646
val useProportionalMinutes = prefsInteractor.getUseProportionalMinutes()
4747
val showFirstEnterHint = recordTypes.filterNot(RecordType::hidden).isEmpty()
4848
val showDefaultTypesButton = !prefsInteractor.getDefaultTypesHidden()
49-
val showRepeatButton = recordRepeatInteractor.shouldShowButton()
49+
val hasAnyRecords = !recordInteractor.isEmpty()
5050
val showPomodoroButton = prefsInteractor.getEnablePomodoroMode()
51+
val showRepeatButton = prefsInteractor.getEnableRepeatButton()
5152
val isPomodoroStarted = prefsInteractor.getPomodoroModeStartedTimestampMs() != 0L
5253
val goals = filterGoalsByDayOfWeekInteractor
5354
.execute(recordTypeGoalInteractor.getAllTypeGoals())
@@ -123,13 +124,15 @@ class RunningRecordsViewDataInteractor @Inject constructor(
123124
.let { data ->
124125
mutableListOf<ViewHolderType>().apply {
125126
data.let(::addAll)
126-
if (showRepeatButton) {
127+
// If no records yet - don't show additional options,
128+
// kind of like an onboarding, to not overload new user with options.
129+
if (showRepeatButton&& hasAnyRecords) {
127130
recordTypeViewDataMapper.mapToRepeatItem(
128131
numberOfCards = numberOfCards,
129132
isDarkTheme = isDarkTheme,
130133
).let(::add)
131134
}
132-
if (showPomodoroButton) {
135+
if (showPomodoroButton && hasAnyRecords) {
133136
recordTypeViewDataMapper.mapToPomodoroItem(
134137
numberOfCards = numberOfCards,
135138
isDarkTheme = isDarkTheme,

features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsAdditionalViewDataInteractor.kt

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,6 @@ class SettingsAdditionalViewDataInteractor @Inject constructor(
103103
processSameItemSelected = false,
104104
)
105105

106-
val repeatButtonViewData = loadRepeatButtonViewData()
107-
result += SettingsSpinnerViewData(
108-
block = SettingsBlock.AdditionalRepeatButton,
109-
title = resourceRepo.getString(R.string.settings_repeat_button_type),
110-
value = repeatButtonViewData.items
111-
.getOrNull(repeatButtonViewData.selectedPosition)?.text.orEmpty(),
112-
items = repeatButtonViewData.items,
113-
selectedPosition = repeatButtonViewData.selectedPosition,
114-
processSameItemSelected = false,
115-
).let(::SettingsSpinnerEvenViewData)
116-
117106
val startOfDayViewData = loadStartOfDayViewData()
118107
result += SettingsSelectorWithButtonViewData(
119108
data = SettingsSelectorViewData(
@@ -171,11 +160,6 @@ class SettingsAdditionalViewDataInteractor @Inject constructor(
171160
.let(settingsMapper::toFirstDayOfWeekViewData)
172161
}
173162

174-
private suspend fun loadRepeatButtonViewData(): RepeatButtonViewData {
175-
return prefsInteractor.getRepeatButtonType()
176-
.let(settingsMapper::toRepeatButtonViewData)
177-
}
178-
179163
private suspend fun loadStartOfDayViewData(): SettingsStartOfDayViewData {
180164
val shift = prefsInteractor.getStartOfDayShift()
181165
val useMilitaryTime = prefsInteractor.getUseMilitaryTimeFormat()

features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsDisplayViewDataInteractor.kt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ import com.example.util.simpletimetracker.feature_settings.adapter.SettingsCheck
1414
import com.example.util.simpletimetracker.feature_settings.adapter.SettingsCollapseViewData
1515
import com.example.util.simpletimetracker.feature_settings.adapter.SettingsHintViewData
1616
import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSelectorViewData
17+
import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSpinnerEvenViewData
1718
import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSpinnerViewData
1819
import com.example.util.simpletimetracker.feature_settings.adapter.SettingsSpinnerWithButtonViewData
1920
import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTextViewData
2021
import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTopViewData
2122
import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper
2223
import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData
24+
import com.example.util.simpletimetracker.feature_settings.viewData.RepeatButtonViewData
2325
import com.example.util.simpletimetracker.feature_settings.viewData.WidgetTransparencyViewData
2426
import com.example.util.simpletimetracker.navigation.params.screen.CardOrderDialogParams
2527
import javax.inject.Inject
@@ -135,6 +137,29 @@ class SettingsDisplayViewDataInteractor @Inject constructor(
135137
dividerIsVisible = true,
136138
)
137139
}
140+
val enableRepeatButton = prefsInteractor.getEnableRepeatButton()
141+
result += SettingsCheckboxViewData(
142+
block = SettingsBlock.DisplayEnableRepeatButton,
143+
title = "Show repeat button on main screen", // TODO NEW add resource
144+
subtitle = "",
145+
isChecked = enableRepeatButton,
146+
bottomSpaceIsVisible = !enableRepeatButton,
147+
dividerIsVisible = !enableRepeatButton,
148+
)
149+
// TODO NEW fix tests, add more
150+
// TODO NEW move some settings from display, too much
151+
if (enableRepeatButton) {
152+
val repeatButtonViewData = loadRepeatButtonViewData()
153+
result += SettingsSpinnerViewData(
154+
block = SettingsBlock.DisplayRepeatButtonMode,
155+
title = resourceRepo.getString(R.string.settings_repeat_button_type), // TODO NEW rename to mode
156+
value = repeatButtonViewData.items
157+
.getOrNull(repeatButtonViewData.selectedPosition)?.text.orEmpty(),
158+
items = repeatButtonViewData.items,
159+
selectedPosition = repeatButtonViewData.selectedPosition,
160+
processSameItemSelected = false,
161+
).let(::SettingsSpinnerEvenViewData)
162+
}
138163
val enablePomodoroMode = prefsInteractor.getEnablePomodoroMode()
139164
result += SettingsCheckboxWithButtonViewData(
140165
data = SettingsCheckboxViewData(
@@ -317,4 +342,9 @@ class SettingsDisplayViewDataInteractor @Inject constructor(
317342
return prefsInteractor.getUseProportionalMinutes()
318343
.let(settingsMapper::toUseProportionalMinutesHint)
319344
}
345+
346+
private suspend fun loadRepeatButtonViewData(): RepeatButtonViewData {
347+
return prefsInteractor.getRepeatButtonType()
348+
.let(settingsMapper::toRepeatButtonViewData)
349+
}
320350
}

features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,8 @@ class SettingsViewModel @Inject constructor(
173173
displayDelegate.onShowActivityFiltersClicked()
174174
SettingsBlock.DisplayEnablePomodoroMode ->
175175
displayDelegate.onEnablePomodoroModeClicked()
176+
SettingsBlock.DisplayEnableRepeatButton ->
177+
displayDelegate.onEnableRepeatButtonClicked()
176178
SettingsBlock.DisplayPomodoroModeActivities ->
177179
displayDelegate.onPomodoroModeActivitiesClicked()
178180
SettingsBlock.DisplayAllowMultipleActivityFilters ->
@@ -223,10 +225,10 @@ class SettingsViewModel @Inject constructor(
223225
displayDelegate.onCategoryOrderSelected(position)
224226
SettingsBlock.DisplaySortTags ->
225227
displayDelegate.onTagOrderSelected(position)
228+
SettingsBlock.DisplayRepeatButtonMode ->
229+
additionalDelegate.onRepeatButtonSelected(position)
226230
SettingsBlock.AdditionalFirstDayOfWeek ->
227231
additionalDelegate.onFirstDayOfWeekSelected(position)
228-
SettingsBlock.AdditionalRepeatButton ->
229-
additionalDelegate.onRepeatButtonSelected(position)
230232
else -> {
231233
// Do nothing
232234
}

0 commit comments

Comments
 (0)