Skip to content

Commit 1a585c9

Browse files
committed
add start and stop timers by long click
1 parent fa3621f commit 1a585c9

40 files changed

Lines changed: 242 additions & 18 deletions

File tree

data_local/src/main/java/com/example/util/simpletimetracker/data_local/backup/BackupPrefsRepo.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Compani
8888
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_DURATION_PRESENTATION_FORMAT
8989
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_ENABLE_SEARCH_ON_MAIN
9090
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_HIDDEN_COMMENT_FILTERS
91+
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_START_TIMER_BY_LONG_CLICK
9192
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_POMODORO_SHOW_MORE_CONTROLS
9293
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_TYPE_ADDITIONAL_FIELDS_SHOWN
9394
import com.example.util.simpletimetracker.data_local.prefs.PrefsRepoImpl.Companion.KEY_UNTRACKED_RANGE_ENABLED
@@ -223,6 +224,7 @@ class BackupPrefsRepo @Inject constructor(
223224
PrefsProcessor(KEY_DURATION_PRESENTATION_FORMAT, ::durationFormat),
224225
PrefsProcessor(KEY_SHOW_SECONDS, ::showSeconds),
225226
PrefsProcessor(KEY_KEEP_SCREEN_ON, ::keepScreenOn),
227+
PrefsProcessor(KEY_START_TIMER_BY_LONG_CLICK, ::startTimerByLongClick),
226228
PrefsProcessor(KEY_SHOW_RECORD_TAG_SELECTION, ::showRecordTagSelection),
227229
PrefsProcessor(KEY_RECORD_TAG_SELECTION_CLOSE_AFTER_ONE, ::recordTagSelectionCloseAfterOne),
228230
PrefsProcessor(KEY_SHOW_RECORD_TAG_SELECTION_EXCLUDE_ACTIVITIES, ::recordTagSelectionExcludeActivities),

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,10 @@ class PrefsRepoImpl @Inject constructor(
341341
KEY_KEEP_SCREEN_ON, false,
342342
)
343343

344+
override var startTimerByLongClick: Boolean by prefs.delegate(
345+
KEY_START_TIMER_BY_LONG_CLICK, false,
346+
)
347+
344348
override var showRecordTagSelection: Boolean by prefs.delegate(
345349
KEY_SHOW_RECORD_TAG_SELECTION, false,
346350
)
@@ -708,6 +712,7 @@ class PrefsRepoImpl @Inject constructor(
708712
const val KEY_DURATION_PRESENTATION_FORMAT = "durationPresentationFormat"
709713
const val KEY_SHOW_SECONDS = "showSeconds"
710714
const val KEY_KEEP_SCREEN_ON = "keepScreenOn"
715+
const val KEY_START_TIMER_BY_LONG_CLICK = "startTimerByLongClick"
711716
const val KEY_SHOW_RECORD_TAG_SELECTION = "showRecordTagSelection"
712717
const val KEY_SHOW_RECORD_TAG_SELECTION_EXCLUDE_ACTIVITIES = "showRecordTagSelectionExcludeActivities"
713718
const val KEY_SHOW_COMMENT_INPUT = "showCommentInput"

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,14 @@ class PrefsInteractor @Inject constructor(
715715
prefsRepo.keepScreenOn = keep
716716
}
717717

718+
suspend fun getStartTimerByLongClick(): Boolean = withContext(Dispatchers.IO) {
719+
prefsRepo.startTimerByLongClick
720+
}
721+
722+
suspend fun setStartTimerByLongClick(enabled: Boolean) = withContext(Dispatchers.IO) {
723+
prefsRepo.startTimerByLongClick = enabled
724+
}
725+
718726
suspend fun getShowRecordTagSelection(): Boolean = withContext(Dispatchers.IO) {
719727
prefsRepo.showRecordTagSelection
720728
}

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

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

145145
var keepScreenOn: Boolean
146146

147+
var startTimerByLongClick: Boolean
148+
147149
var showRecordTagSelection: Boolean
148150

149151
var recordTagSelectionCloseAfterOne: Boolean

features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/recordType/RecordTypeAdapterDelegate.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import androidx.core.view.ViewCompat
44
import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate
55
import com.example.util.simpletimetracker.feature_views.TransitionNames
66
import com.example.util.simpletimetracker.feature_views.extension.dpToPx
7+
import com.example.util.simpletimetracker.feature_views.extension.setOnClick
78
import com.example.util.simpletimetracker.feature_views.extension.setOnClickWith
89
import com.example.util.simpletimetracker.feature_views.extension.setOnLongClick
910
import com.example.util.simpletimetracker.feature_base_adapter.databinding.ItemRecordTypeLayoutBinding as Binding
1011
import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData as ViewData
1112

1213
fun createRecordTypeAdapterDelegate(
1314
onItemClick: ((ViewData) -> Unit)? = null,
15+
onItemClickWithData: ((ViewData, Pair<Any, String>) -> Unit)? = null,
1416
onItemLongClick: ((ViewData, Pair<Any, String>) -> Unit)? = null,
1517
withTransition: Boolean = false,
1618
transitionNamePrefix: String = TransitionNames.RECORD_TYPE,
@@ -38,6 +40,7 @@ fun createRecordTypeAdapterDelegate(
3840
itemIsComplete = item.isComplete
3941
getCheckmarkOutline().itemIsFiltered = item.itemIsFiltered
4042
onItemClick?.let { setOnClickWith(item, it) }
43+
onItemClickWithData?.let { setOnClick { it(item, this to transitionName) } }
4144
onItemLongClick?.let { setOnLongClick { it(item, this to transitionName) } }
4245
if (withTransition) ViewCompat.setTransitionName(this, transitionName)
4346
}

features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/recordTypeSuggestion/RecordTypeSuggestionAdapterDelegate.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ import com.example.util.simpletimetracker.feature_base_adapter.recordTypeSuggest
1616
fun createRecordTypeSuggestionAdapterDelegate(
1717
type: ViewData.Type,
1818
onItemClick: ((BaseViewData) -> Unit)? = null,
19+
onItemClickWithData: ((BaseViewData, Pair<Any, String>) -> Unit)? = null,
1920
onItemLongClick: ((BaseViewData, Pair<Any, String>) -> Unit)? = null,
2021
withTransition: Boolean = true,
2122
): RecyclerAdapterDelegate {
2223
val baseAdapter = createRecordTypeAdapterDelegate(
2324
onItemClick = onItemClick,
25+
onItemClickWithData = onItemClickWithData,
2426
onItemLongClick = onItemLongClick,
2527
withTransition = withTransition,
2628
transitionNamePrefix = TransitionNames.RECORD_TYPE_SUGGESTION,

features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/recordWithHint/RecordWithHintAdapterDelegate.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ package com.example.util.simpletimetracker.feature_base_adapter.recordWithHint
22

33
import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate
44
import com.example.util.simpletimetracker.feature_base_adapter.record.bindState
5+
import com.example.util.simpletimetracker.feature_views.extension.setOnClick
56
import com.example.util.simpletimetracker.feature_views.extension.setOnLongClick
67
import com.example.util.simpletimetracker.feature_base_adapter.databinding.ItemRecordWithHintLayoutBinding as Binding
78
import com.example.util.simpletimetracker.feature_base_adapter.recordWithHint.RecordWithHintViewData as ViewData
89

910
fun createRecordWithHintAdapterDelegate(
10-
onItemLongClick: ((ViewData) -> Unit) = { _ -> },
11+
onItemClick: (ViewData) -> Unit,
12+
onItemLongClick: (ViewData) -> Unit,
1113
) = createRecyclerBindingAdapterDelegate<ViewData, Binding>(
1214
Binding::inflate,
1315
) { binding, item, _ ->
@@ -16,6 +18,7 @@ fun createRecordWithHintAdapterDelegate(
1618
item as ViewData
1719

1820
bindState(item.record)
21+
setOnClick { onItemClick(item) }
1922
setOnLongClick { onItemLongClick(item) }
2023
}
2124
}

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ class RunningRecordsViewDataInteractor @Inject constructor(
7272
val isFiltersCollapsed = prefsInteractor.getIsActivityFiltersCollapsed()
7373
val isNavBarAtTheBottom = prefsInteractor.getIsNavBarAtTheBottom()
7474
val enableSearchOnMain = prefsInteractor.getEnableSearchOnMain()
75+
val startTimersByLongClick = prefsInteractor.getStartTimerByLongClick()
7576
val goals = filterGoalsByDayOfWeekInteractor
7677
.execute(recordTypeGoalInteractor.getAllTypeGoals())
7778
.groupBy { it.idData.value }
@@ -102,10 +103,13 @@ class RunningRecordsViewDataInteractor @Inject constructor(
102103
durationFormat = durationFormat,
103104
useMilitaryTime = useMilitaryTime,
104105
showSeconds = showSeconds,
106+
startTimersByLongClick = startTimersByLongClick,
105107
)
106108
}
107109
runningRecords.isEmpty() -> {
108-
listOf(mapper.mapToEmpty())
110+
mapper.mapToEmpty(
111+
startTimersByLongClick = startTimersByLongClick,
112+
).let(::listOf)
109113
}
110114
else -> {
111115
runningRecords
@@ -126,7 +130,9 @@ class RunningRecordsViewDataInteractor @Inject constructor(
126130
)
127131
}
128132
.plus(
129-
mapper.mapToHasRunningRecords(),
133+
mapper.mapToHasRunningRecords(
134+
startTimersByLongLick = startTimersByLongClick,
135+
),
130136
)
131137
}
132138
}

features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/mapper/RunningRecordsViewDataMapper.kt

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,35 @@ class RunningRecordsViewDataMapper @Inject constructor(
3939
)
4040
}
4141

42-
fun mapToEmpty(): ViewHolderType {
42+
fun mapToEmpty(
43+
startTimersByLongClick: Boolean,
44+
): ViewHolderType {
45+
val titleResId = if (!startTimersByLongClick) {
46+
R.string.running_records_empty
47+
} else {
48+
R.string.running_records_empty_inverted
49+
}
50+
val hintResId = if (!startTimersByLongClick) {
51+
R.string.running_records_empty_hint
52+
} else {
53+
R.string.running_records_empty_hint_inverted
54+
}
4355
return EmptyViewData(
44-
message = R.string.running_records_empty.let(resourceRepo::getString),
45-
hint = R.string.running_records_empty_hint.let(resourceRepo::getString),
56+
message = resourceRepo.getString(titleResId),
57+
hint = resourceRepo.getString(hintResId),
4658
)
4759
}
4860

49-
fun mapToHasRunningRecords(): ViewHolderType {
61+
fun mapToHasRunningRecords(
62+
startTimersByLongLick: Boolean,
63+
): ViewHolderType {
64+
val resId = if (!startTimersByLongLick) {
65+
R.string.running_records_has_timers
66+
} else {
67+
R.string.running_records_has_timers_inverted
68+
}
5069
return HintViewData(
51-
text = R.string.running_records_has_timers.let(resourceRepo::getString),
70+
text = resourceRepo.getString(resId),
5271
paddingTop = 0,
5372
paddingBottom = 0,
5473
)
@@ -63,13 +82,19 @@ class RunningRecordsViewDataMapper @Inject constructor(
6382
durationFormat: DurationFormat,
6483
useMilitaryTime: Boolean,
6584
showSeconds: Boolean,
85+
startTimersByLongClick: Boolean,
6686
): List<ViewHolderType> {
6787
val result = mutableListOf<ViewHolderType>()
6888

6989
if (prevRecords.isEmpty()) {
90+
val hintResId = if (!startTimersByLongClick) {
91+
R.string.running_records_empty_hint
92+
} else {
93+
R.string.running_records_empty_hint_inverted
94+
}
7095
result += EmptyViewData(
7196
message = resourceRepo.getString(R.string.retroactive_tracking_mode_hint),
72-
hint = R.string.running_records_empty_hint.let(resourceRepo::getString),
97+
hint = resourceRepo.getString(hintResId),
7398
)
7499
}
75100

features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/view/RunningRecordsFragment.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,17 @@ class RunningRecordsFragment :
7878
onItemLongClick = viewModel::onRunningRecordLongClick,
7979
),
8080
createRecordTypeAdapterDelegate(
81-
onItemClick = viewModel::onRecordTypeClick,
81+
onItemClickWithData = viewModel::onRecordTypeClick,
8282
onItemLongClick = viewModel::onRecordTypeLongClick,
8383
withTransition = true,
8484
),
8585
createRecordTypeSuggestionAdapterDelegate(
8686
type = RecordTypeSuggestionType,
87-
onItemClick = viewModel::onRecordTypeClick,
87+
onItemClickWithData = viewModel::onRecordTypeClick,
8888
onItemLongClick = viewModel::onRecordTypeLongClick,
8989
),
9090
createRecordWithHintAdapterDelegate(
91+
onItemClick = throttle(viewModel::onRecordClick),
9192
onItemLongClick = throttle(viewModel::onRecordLongClick),
9293
),
9394
createRecordShortcutAdapterDelegate(

0 commit comments

Comments
 (0)