Skip to content

Commit 194a4f2

Browse files
committed
add repeat button to wear
1 parent be91e4f commit 194a4f2

File tree

36 files changed

+370
-77
lines changed

36 files changed

+370
-77
lines changed

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

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

24-
suspend fun repeat(): Boolean {
24+
suspend fun repeat(): ActionResult {
2525
return execute { messageResId ->
2626
SnackBarParams(
2727
message = resourceRepo.getString(messageResId),
@@ -39,9 +39,13 @@ class RecordRepeatInteractor @Inject constructor(
3939
}
4040
}
4141

42+
suspend fun repeatWithoutMessage(): ActionResult {
43+
return execute(messageShower = {})
44+
}
45+
4246
private suspend fun execute(
4347
messageShower: (messageResId: Int) -> Unit,
44-
): Boolean {
48+
): ActionResult {
4549
val type = prefsInteractor.getRepeatButtonType()
4650

4751
val prevRecord = recordInteractor.getPrev(
@@ -54,18 +58,24 @@ class RecordRepeatInteractor @Inject constructor(
5458
}
5559
} ?: run {
5660
messageShower(R.string.running_records_repeat_no_prev_record)
57-
return false
61+
return ActionResult.NoPreviousFound
5862
}
5963
if (runningRecordInteractor.get(prevRecord.typeId) != null) {
6064
messageShower(R.string.running_records_repeat_already_tracking)
61-
return false
65+
return ActionResult.AlreadyTracking
6266
}
6367

6468
addRunningRecordMediator.startTimer(
6569
typeId = prevRecord.typeId,
6670
tagIds = prevRecord.tagIds,
6771
comment = prevRecord.comment,
6872
)
69-
return true
73+
return ActionResult.Started
74+
}
75+
76+
sealed interface ActionResult {
77+
object Started : ActionResult
78+
object NoPreviousFound : ActionResult
79+
object AlreadyTracking : ActionResult
7080
}
7181
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.example.util.simpletimetracker.domain.interactor.NotificationTypeInte
99
import com.example.util.simpletimetracker.domain.interactor.PomodoroStopInteractor
1010
import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor
1111
import com.example.util.simpletimetracker.domain.interactor.RecordsContainerUpdateInteractor
12+
import com.example.util.simpletimetracker.domain.interactor.WearInteractor
1213
import com.example.util.simpletimetracker.domain.interactor.WidgetInteractor
1314
import com.example.util.simpletimetracker.domain.model.CardOrder
1415
import com.example.util.simpletimetracker.domain.model.CardTagOrder
@@ -34,6 +35,7 @@ class SettingsDisplayViewModelDelegate @Inject constructor(
3435
private val settingsMapper: SettingsMapper,
3536
private val notificationTypeInteractor: NotificationTypeInteractor,
3637
private val notificationActivitySwitchInteractor: NotificationActivitySwitchInteractor,
38+
private val wearInteractor: WearInteractor,
3739
private val widgetInteractor: WidgetInteractor,
3840
private val settingsDisplayViewDataInteractor: SettingsDisplayViewDataInteractor,
3941
private val pomodoroStopInteractor: PomodoroStopInteractor,
@@ -295,6 +297,7 @@ class SettingsDisplayViewModelDelegate @Inject constructor(
295297
prefsInteractor.setEnableRepeatButton(newValue)
296298
notificationTypeInteractor.updateNotifications()
297299
notificationActivitySwitchInteractor.updateNotification()
300+
wearInteractor.update()
298301
parent?.updateContent()
299302
}
300303
}

features/feature_wear/src/main/java/com/example/util/simpletimetracker/feature_wear/WearDataLocalMapper.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package com.example.util.simpletimetracker.feature_wear
77

8+
import com.example.util.simpletimetracker.core.interactor.RecordRepeatInteractor
89
import com.example.util.simpletimetracker.core.mapper.RecordTagViewDataMapper
910
import com.example.util.simpletimetracker.domain.mapper.AppColorMapper
1011
import com.example.util.simpletimetracker.domain.model.AppColor
@@ -13,6 +14,7 @@ import com.example.util.simpletimetracker.domain.model.RecordType
1314
import com.example.util.simpletimetracker.domain.model.RunningRecord
1415
import com.example.util.simpletimetracker.wear_api.WearActivityDTO
1516
import com.example.util.simpletimetracker.wear_api.WearCurrentActivityDTO
17+
import com.example.util.simpletimetracker.wear_api.WearRecordRepeatResponse
1618
import com.example.util.simpletimetracker.wear_api.WearSettingsDTO
1719
import com.example.util.simpletimetracker.wear_api.WearTagDTO
1820
import javax.inject.Inject
@@ -61,10 +63,27 @@ class WearDataLocalMapper @Inject constructor(
6163
fun map(
6264
allowMultitasking: Boolean,
6365
recordTagSelectionCloseAfterOne: Boolean,
66+
enableRepeatButton: Boolean,
6467
): WearSettingsDTO {
6568
return WearSettingsDTO(
6669
allowMultitasking = allowMultitasking,
6770
recordTagSelectionCloseAfterOne = recordTagSelectionCloseAfterOne,
71+
enableRepeatButton = enableRepeatButton,
72+
)
73+
}
74+
75+
fun map(
76+
result: RecordRepeatInteractor.ActionResult,
77+
): WearRecordRepeatResponse {
78+
return WearRecordRepeatResponse(
79+
result = when (result) {
80+
is RecordRepeatInteractor.ActionResult.Started ->
81+
WearRecordRepeatResponse.ActionResult.STARTED
82+
is RecordRepeatInteractor.ActionResult.NoPreviousFound ->
83+
WearRecordRepeatResponse.ActionResult.NO_PREVIOUS_FOUND
84+
is RecordRepeatInteractor.ActionResult.AlreadyTracking ->
85+
WearRecordRepeatResponse.ActionResult.ALREADY_TRACKING
86+
},
6887
)
6988
}
7089

features/feature_wear/src/main/java/com/example/util/simpletimetracker/feature_wear/WearDataRepo.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package com.example.util.simpletimetracker.feature_wear
77

8+
import com.example.util.simpletimetracker.core.interactor.RecordRepeatInteractor
89
import com.example.util.simpletimetracker.domain.interactor.AddRunningRecordMediator
910
import com.example.util.simpletimetracker.domain.interactor.GetSelectableTagsInteractor
1011
import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor
@@ -20,6 +21,7 @@ import com.example.util.simpletimetracker.navigation.Router
2021
import com.example.util.simpletimetracker.wear_api.WearActivityDTO
2122
import com.example.util.simpletimetracker.wear_api.WearCommunicationAPI
2223
import com.example.util.simpletimetracker.wear_api.WearCurrentActivityDTO
24+
import com.example.util.simpletimetracker.wear_api.WearRecordRepeatResponse
2325
import com.example.util.simpletimetracker.wear_api.WearSettingsDTO
2426
import com.example.util.simpletimetracker.wear_api.WearShouldShowTagSelectionRequest
2527
import com.example.util.simpletimetracker.wear_api.WearShouldShowTagSelectionResponse
@@ -38,6 +40,7 @@ class WearDataRepo @Inject constructor(
3840
private val shouldShowTagSelectionInteractor: ShouldShowTagSelectionInteractor,
3941
private val removeRunningRecordMediator: Lazy<RemoveRunningRecordMediator>,
4042
private val addRunningRecordMediator: Lazy<AddRunningRecordMediator>,
43+
private val recordRepeatInteractor: Lazy<RecordRepeatInteractor>,
4144
private val router: Router,
4245
private val widgetInteractor: WidgetInteractor,
4346
private val settingsDataUpdateInteractor: SettingsDataUpdateInteractor,
@@ -77,6 +80,11 @@ class WearDataRepo @Inject constructor(
7780
removeRunningRecordMediator.get().removeWithRecordAdd(current)
7881
}
7982

83+
override suspend fun repeatActivity(): WearRecordRepeatResponse {
84+
return recordRepeatInteractor.get().repeatWithoutMessage()
85+
.let(wearDataLocalMapper::map)
86+
}
87+
8088
override suspend fun queryTagsForActivity(activityId: Long): List<WearTagDTO> {
8189
val types = recordTypeInteractor.getAll().associateBy { it.id }
8290
return getSelectableTagsInteractor.execute(activityId)
@@ -101,6 +109,7 @@ class WearDataRepo @Inject constructor(
101109
return wearDataLocalMapper.map(
102110
allowMultitasking = prefsInteractor.getAllowMultitasking(),
103111
recordTagSelectionCloseAfterOne = prefsInteractor.getRecordTagSelectionCloseAfterOne(),
112+
enableRepeatButton = prefsInteractor.getEnableRepeatButton(),
104113
)
105114
}
106115

features/feature_wear/src/main/java/com/example/util/simpletimetracker/feature_wear/WearRPCServer.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class WearRPCServer @Inject constructor(
3737
WearRequests.QUERY_CURRENT_ACTIVITIES -> onQueryCurrentActivities()
3838
WearRequests.START_ACTIVITY -> onStartActivity(request)
3939
WearRequests.STOP_ACTIVITY -> onStopActivity(request)
40+
WearRequests.REPEAT_ACTIVITY -> onRepeatActivity()
4041
WearRequests.QUERY_TAGS_FOR_ACTIVITY -> onQueryTagsForActivity(request)
4142
WearRequests.QUERY_SHOULD_SHOW_TAG_SELECTION -> onQueryShouldShowTagSelection(request)
4243
WearRequests.QUERY_SETTINGS -> onQuerySettings()
@@ -96,6 +97,10 @@ class WearRPCServer @Inject constructor(
9697
return ByteArray(0)
9798
}
9899

100+
private suspend fun onRepeatActivity(): ByteArray {
101+
return mapToBytes(repo.repeatActivity())
102+
}
103+
99104
private suspend fun onQueryActivities(): ByteArray {
100105
return mapToBytes(repo.queryActivities())
101106
}

features/feature_wear/src/main/res/values/wear.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<item>/stt/QUERY_CURRENT_ACTIVITIES</item>
1010
<item>/stt/START_ACTIVITY</item>
1111
<item>/stt/STOP_ACTIVITY</item>
12+
<item>/stt/REPEAT_ACTIVITY</item>
1213
<item>/stt/QUERY_TAGS_FOR_ACTIVITY</item>
1314
<item>/stt/QUERY_SHOULD_SHOW_TAG_SELECTION</item>
1415
<item>/stt/QUERY_SETTINGS</item>

features/feature_widget/src/main/java/com/example/util/simpletimetracker/feature_widget/universal/activity/viewModel/WidgetUniversalViewModel.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,8 @@ class WidgetUniversalViewModel @Inject constructor(
9898

9999
when (item.type) {
100100
is RunningRecordTypeSpecialViewData.Type.Repeat -> {
101-
started = recordRepeatInteractor.repeat()
101+
val result = recordRepeatInteractor.repeat()
102+
started = result is RecordRepeatInteractor.ActionResult.Started
102103
}
103104
else -> return@launch
104105
}

wear/src/main/java/com/example/util/simpletimetracker/data/WearDataLocalMapper.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ package com.example.util.simpletimetracker.data
77

88
import com.example.util.simpletimetracker.domain.model.WearActivity
99
import com.example.util.simpletimetracker.domain.model.WearCurrentActivity
10+
import com.example.util.simpletimetracker.domain.model.WearRecordRepeatResult
1011
import com.example.util.simpletimetracker.domain.model.WearSettings
1112
import com.example.util.simpletimetracker.domain.model.WearTag
1213
import com.example.util.simpletimetracker.wear_api.WearActivityDTO
1314
import com.example.util.simpletimetracker.wear_api.WearCurrentActivityDTO
15+
import com.example.util.simpletimetracker.wear_api.WearRecordRepeatResponse
1416
import com.example.util.simpletimetracker.wear_api.WearSettingsDTO
1517
import com.example.util.simpletimetracker.wear_api.WearTagDTO
1618
import javax.inject.Inject
@@ -46,13 +48,28 @@ class WearDataLocalMapper @Inject constructor() {
4648
return WearSettings(
4749
allowMultitasking = dto.allowMultitasking,
4850
recordTagSelectionCloseAfterOne = dto.recordTagSelectionCloseAfterOne,
51+
enableRepeatButton = dto.enableRepeatButton,
4952
)
5053
}
5154

5255
fun map(domain: WearSettings): WearSettingsDTO {
5356
return WearSettingsDTO(
5457
allowMultitasking = domain.allowMultitasking,
5558
recordTagSelectionCloseAfterOne = domain.recordTagSelectionCloseAfterOne,
59+
enableRepeatButton = domain.enableRepeatButton,
60+
)
61+
}
62+
63+
fun map(dto: WearRecordRepeatResponse): WearRecordRepeatResult {
64+
return WearRecordRepeatResult(
65+
result = when (dto.result) {
66+
WearRecordRepeatResponse.ActionResult.STARTED ->
67+
WearRecordRepeatResult.ActionResult.Started
68+
WearRecordRepeatResponse.ActionResult.NO_PREVIOUS_FOUND ->
69+
WearRecordRepeatResult.ActionResult.NoPreviousFound
70+
WearRecordRepeatResponse.ActionResult.ALREADY_TRACKING ->
71+
WearRecordRepeatResult.ActionResult.AlreadyTracking
72+
},
5673
)
5774
}
5875
}

wear/src/main/java/com/example/util/simpletimetracker/data/WearDataRepo.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,13 @@ package com.example.util.simpletimetracker.data
88
import com.example.util.simpletimetracker.complication.WearComplicationManager
99
import com.example.util.simpletimetracker.domain.model.WearActivity
1010
import com.example.util.simpletimetracker.domain.model.WearCurrentActivity
11+
import com.example.util.simpletimetracker.domain.model.WearRecordRepeatResult
1112
import com.example.util.simpletimetracker.domain.model.WearSettings
1213
import com.example.util.simpletimetracker.domain.model.WearTag
1314
import com.example.util.simpletimetracker.notification.WearNotificationManager
1415
import com.example.util.simpletimetracker.wear_api.WearActivityDTO
1516
import com.example.util.simpletimetracker.wear_api.WearCurrentActivityDTO
17+
import com.example.util.simpletimetracker.wear_api.WearSettingsDTO
1618
import com.example.util.simpletimetracker.wear_api.WearShouldShowTagSelectionRequest
1719
import com.example.util.simpletimetracker.wear_api.WearStartActivityRequest
1820
import com.example.util.simpletimetracker.wear_api.WearStopActivityRequest
@@ -47,6 +49,7 @@ class WearDataRepo @Inject constructor(
4749

4850
private var activitiesCache: List<WearActivityDTO>? = null
4951
private var currentActivitiesCache: List<WearCurrentActivityDTO>? = null
52+
private var settingsCache: WearSettingsDTO? = null
5053
private val mutex: Mutex = Mutex()
5154

5255
init {
@@ -55,6 +58,7 @@ class WearDataRepo @Inject constructor(
5558
val deferred = mutableListOf<Deferred<Any>>()
5659
deferred += async { loadActivities(forceReload = true) }
5760
deferred += async { loadCurrentActivities(forceReload = true) }
61+
deferred += async { loadSettings(forceReload = true) }
5862
deferred.awaitAll()
5963
wearComplicationManager.updateComplications()
6064
wearNotificationManager.get().updateNotifications()
@@ -99,6 +103,13 @@ class WearDataRepo @Inject constructor(
99103
}
100104
}
101105

106+
suspend fun repeatActivity(): Result<WearRecordRepeatResult> = mutex.withLock {
107+
return runCatching {
108+
val response = wearRPCClient.repeatActivity()
109+
wearDataLocalMapper.map(response)
110+
}
111+
}
112+
102113
suspend fun loadTagsForActivity(activityId: Long): Result<List<WearTag>> = mutex.withLock {
103114
return runCatching {
104115
val data = wearRPCClient.queryTagsForActivity(activityId)
@@ -113,10 +124,14 @@ class WearDataRepo @Inject constructor(
113124
}
114125
}
115126

116-
suspend fun loadSettings(): Result<WearSettings> = mutex.withLock {
127+
suspend fun loadSettings(
128+
forceReload: Boolean,
129+
): Result<WearSettings> = mutex.withLock {
117130
return runCatching {
118-
val data = wearRPCClient.querySettings()
119-
wearDataLocalMapper.map(data)
131+
val data = settingsCache.takeUnless { forceReload }
132+
?: wearRPCClient.querySettings()
133+
.also { settingsCache = it }
134+
data.let(wearDataLocalMapper::map)
120135
}
121136
}
122137

wear/src/main/java/com/example/util/simpletimetracker/data/WearRPCClient.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ package com.example.util.simpletimetracker.data
88
import com.example.util.simpletimetracker.wear_api.WearActivityDTO
99
import com.example.util.simpletimetracker.wear_api.WearCommunicationAPI
1010
import com.example.util.simpletimetracker.wear_api.WearCurrentActivityDTO
11+
import com.example.util.simpletimetracker.wear_api.WearRecordRepeatResponse
1112
import com.example.util.simpletimetracker.wear_api.WearRequests
1213
import com.example.util.simpletimetracker.wear_api.WearSettingsDTO
1314
import com.example.util.simpletimetracker.wear_api.WearShouldShowTagSelectionRequest
@@ -52,6 +53,14 @@ class WearRPCClient @Inject constructor(
5253
messenger.send(WearRequests.STOP_ACTIVITY, mapToBytes(request))
5354
}
5455

56+
override suspend fun repeatActivity(): WearRecordRepeatResponse {
57+
val response: WearRecordRepeatResponse? = messenger
58+
.send(WearRequests.REPEAT_ACTIVITY)
59+
?.let(::mapFromBytes)
60+
61+
return response ?: throw WearRPCException
62+
}
63+
5564
override suspend fun queryTagsForActivity(activityId: Long): List<WearTagDTO> {
5665
val response: List<WearTagDTO>? = messenger
5766
.send(WearRequests.QUERY_TAGS_FOR_ACTIVITY, mapToBytes(activityId))

0 commit comments

Comments
 (0)