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.

refactor range end scheduling

razeeman (Oct 29, 2023, 10:48 AM +0300) 020a9152 86899b70

+64 -65
+1 -1
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/AddRecordMediator.kt
··· 20 20 21 21 suspend fun doAfterAdd(typeId: Long) { 22 22 notificationTypeInteractor.checkAndShow(typeId) 23 - notificationGoalTimeInteractor.checkAndReschedule(typeId) 23 + notificationGoalTimeInteractor.checkAndReschedule(listOf(typeId)) 24 24 widgetInteractor.updateWidgets(listOf(WidgetType.STATISTICS_CHART)) 25 25 widgetInteractor.updateSingleWidgets(typeIds = listOf(typeId)) 26 26 }
+1 -1
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/AddRunningRecordMediator.kt
··· 94 94 notificationInactivityInteractor.cancel() 95 95 // Schedule only on first activity start. 96 96 if (runningRecordInteractor.getAll().size == 1) notificationActivityInteractor.checkAndSchedule() 97 - notificationGoalTimeInteractor.checkAndReschedule(typeId) 97 + notificationGoalTimeInteractor.checkAndReschedule(listOf(typeId)) 98 98 widgetInteractor.updateWidgets() 99 99 } 100 100 }
+2 -6
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/NotificationGoalRangeEndInteractor.kt
··· 1 1 package com.example.util.simpletimetracker.domain.interactor 2 2 3 - import com.example.util.simpletimetracker.domain.model.RecordTypeGoal 4 - 5 3 interface NotificationGoalRangeEndInteractor { 6 4 7 - suspend fun checkAndRescheduleDaily() 5 + suspend fun checkAndReschedule() 8 6 9 - suspend fun schedule(range: RecordTypeGoal.Range) 10 - 11 - fun cancel(range: RecordTypeGoal.Range) 7 + fun cancel() 12 8 }
+1 -1
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/NotificationGoalTimeInteractor.kt
··· 6 6 7 7 suspend fun checkAndReschedule() 8 8 9 - suspend fun checkAndReschedule(typeId: Long) 9 + suspend fun checkAndReschedule(typeIds: List<Long>) 10 10 11 11 fun cancel(typeId: Long) 12 12
+1 -1
domain/src/main/java/com/example/util/simpletimetracker/domain/interactor/RemoveRecordMediator.kt
··· 17 17 18 18 suspend fun doAfterRemove(typeId: Long) { 19 19 notificationTypeInteractor.checkAndShow(typeId) 20 - notificationGoalTimeInteractor.checkAndReschedule(typeId) 20 + notificationGoalTimeInteractor.checkAndReschedule(listOf(typeId)) 21 21 widgetInteractor.updateWidgets(listOf(WidgetType.STATISTICS_CHART)) 22 22 widgetInteractor.updateSingleWidgets(typeIds = listOf(typeId)) 23 23 }
+1 -1
features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordViewModel.kt
··· 110 110 addRecordMediator.add(it) 111 111 if (newTypeId != originalTypeId) { 112 112 notificationTypeInteractor.checkAndShow(originalTypeId) 113 - notificationGoalTimeInteractor.checkAndReschedule(originalTypeId) 113 + notificationGoalTimeInteractor.checkAndReschedule(listOf(originalTypeId)) 114 114 } 115 115 router.back() 116 116 }
+1 -5
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/viewModel/ChangeRecordTypeViewModel.kt
··· 18 18 import com.example.util.simpletimetracker.domain.extension.getSession 19 19 import com.example.util.simpletimetracker.domain.extension.getWeekly 20 20 import com.example.util.simpletimetracker.domain.extension.orZero 21 - import com.example.util.simpletimetracker.domain.interactor.NotificationGoalRangeEndInteractor 22 21 import com.example.util.simpletimetracker.domain.interactor.NotificationGoalTimeInteractor 23 22 import com.example.util.simpletimetracker.domain.interactor.NotificationTypeInteractor 24 23 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor ··· 81 80 private val iconEmojiMapper: IconEmojiMapper, 82 81 private val colorMapper: ColorMapper, 83 82 private val checkExactAlarmPermissionInteractor: CheckExactAlarmPermissionInteractor, 84 - private val notificationGoalRangeEndInteractor: NotificationGoalRangeEndInteractor, 85 83 ) : ViewModel() { 86 84 87 85 lateinit var extra: ChangeRecordTypeParams ··· 441 439 saveCategories(addedId) 442 440 saveGoals(addedId) 443 441 notificationTypeInteractor.updateNotifications() 444 - notificationGoalTimeInteractor.checkAndReschedule(recordTypeId) 442 + notificationGoalTimeInteractor.checkAndReschedule(listOf(recordTypeId)) 445 443 widgetInteractor.updateWidgets() 446 444 keyboardVisibility.set(false) 447 445 router.back() ··· 565 563 goalType = newGoalsState.monthly, 566 564 goalRange = RecordTypeGoal.Range.Monthly, 567 565 ) 568 - 569 - notificationGoalRangeEndInteractor.checkAndRescheduleDaily() 570 566 } 571 567 572 568 private suspend fun initializeRecordTypeData() {
+1 -1
features/feature_data_edit/src/main/java/com/example/util/simpletimetracker/feature_data_edit/interactor/DateEditChangeInteractor.kt
··· 99 99 // Check goal time and statistics widget consistency. 100 100 if (newTypeId != null) { 101 101 oldTypeIds.forEach { typeId -> 102 - notificationGoalTimeInteractor.checkAndReschedule(typeId) 102 + notificationGoalTimeInteractor.checkAndReschedule(listOf(typeId)) 103 103 } 104 104 addRecordMediator.doAfterAdd(newTypeId) 105 105 }
+25 -11
features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/goalTime/interactor/NotificationGoalRangeEndInteractorImpl.kt
··· 14 14 private val recordTypeGoalInteractor: RecordTypeGoalInteractor, 15 15 ) : NotificationGoalRangeEndInteractor { 16 16 17 - override suspend fun checkAndRescheduleDaily() { 18 - val hasDailyGoals = recordTypeGoalInteractor.getAll() 19 - .any { it.range is RecordTypeGoal.Range.Daily } 17 + override suspend fun checkAndReschedule() { 18 + cancel() 20 19 20 + val goals = recordTypeGoalInteractor.getAll() 21 + 22 + val hasDailyGoals = goals.any { it.range is RecordTypeGoal.Range.Daily } 21 23 if (hasDailyGoals) { 22 24 schedule(RecordTypeGoal.Range.Daily) 23 - } else { 24 - cancel(RecordTypeGoal.Range.Daily) 25 + } 26 + 27 + val hasWeeklyGoals = goals.any { it.range is RecordTypeGoal.Range.Weekly } 28 + if (hasWeeklyGoals) { 29 + schedule(RecordTypeGoal.Range.Weekly) 30 + } 31 + 32 + val hasMonthlyGoals = goals.any { it.range is RecordTypeGoal.Range.Monthly } 33 + if (hasMonthlyGoals) { 34 + schedule(RecordTypeGoal.Range.Monthly) 25 35 } 26 36 } 27 37 28 - override suspend fun schedule(range: RecordTypeGoal.Range) { 29 - cancel(range) 38 + override fun cancel() { 39 + listOf( 40 + RecordTypeGoal.Range.Daily, 41 + RecordTypeGoal.Range.Weekly, 42 + RecordTypeGoal.Range.Monthly, 43 + ).forEach { 44 + rangeEndScheduler.cancelSchedule(it) 45 + } 46 + } 30 47 48 + private suspend fun schedule(range: RecordTypeGoal.Range) { 31 49 val forRange = when (range) { 32 50 is RecordTypeGoal.Range.Session -> return 33 51 is RecordTypeGoal.Range.Daily -> RangeLength.Day ··· 39 57 timestamp = forRange.timeEnded, 40 58 goalRange = RecordTypeGoal.Range.Daily, 41 59 ) 42 - } 43 - 44 - override fun cancel(range: RecordTypeGoal.Range) { 45 - rangeEndScheduler.cancelSchedule(range) 46 60 } 47 61 }
+30 -37
features/feature_notification/src/main/java/com/example/util/simpletimetracker/feature_notification/goalTime/interactor/NotificationGoalTimeInteractorImpl.kt
··· 12 12 import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor 13 13 import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor 14 14 import com.example.util.simpletimetracker.domain.model.RecordTypeGoal 15 + import com.example.util.simpletimetracker.domain.model.RunningRecord 15 16 import com.example.util.simpletimetracker.feature_notification.goalTime.manager.NotificationGoalTimeManager 16 17 import com.example.util.simpletimetracker.feature_notification.goalTime.scheduler.NotificationGoalTimeScheduler 17 18 import javax.inject.Inject ··· 28 29 ) : NotificationGoalTimeInteractor { 29 30 30 31 override suspend fun checkAndReschedule() { 31 - runningRecordInteractor.getAll().forEach { 32 - checkAndReschedule(it.id) 33 - } 34 - notificationGoalRangeEndInteractor.checkAndRescheduleDaily() 32 + runningRecordInteractor.getAll() 33 + .map(RunningRecord::id) 34 + .let { checkAndReschedule(it) } 35 35 } 36 36 37 - override suspend fun checkAndReschedule(typeId: Long) { 37 + override suspend fun checkAndReschedule(typeIds: List<Long>) { 38 + typeIds.forEach { checkAndReschedule(it) } 39 + notificationGoalRangeEndInteractor.checkAndReschedule() 40 + } 41 + 42 + override fun cancel(typeId: Long) { 43 + listOf( 44 + RecordTypeGoal.Range.Session, 45 + RecordTypeGoal.Range.Daily, 46 + RecordTypeGoal.Range.Weekly, 47 + RecordTypeGoal.Range.Monthly, 48 + ).forEach { 49 + scheduler.cancelSchedule(typeId, it) 50 + manager.hide(typeId, it) 51 + } 52 + } 53 + 54 + override suspend fun show(typeId: Long, goalRange: RecordTypeGoal.Range) { 55 + notificationGoalParamsInteractor.execute( 56 + typeId = typeId, 57 + range = goalRange, 58 + type = NotificationGoalParamsInteractor.Type.Duration, 59 + )?.let(manager::show) 60 + } 61 + 62 + private suspend fun checkAndReschedule(typeId: Long) { 38 63 val recordType = recordTypeInteractor.get(typeId) 39 64 val runningRecord = runningRecordInteractor.get(typeId) 40 65 val goals = recordTypeGoalInteractor.getByType(typeId) ··· 42 67 if (recordType == null || runningRecord == null) return 43 68 44 69 cancel(typeId) 45 - 46 - listOf( 47 - RecordTypeGoal.Range.Weekly, 48 - RecordTypeGoal.Range.Monthly, 49 - ).forEach { notificationGoalRangeEndInteractor.cancel(it) } 50 70 51 71 // Session 52 72 val sessionCurrent = System.currentTimeMillis() - runningRecord.timeStarted ··· 70 90 typeId = typeId, 71 91 goalRange = RecordTypeGoal.Range.Daily, 72 92 ) 73 - // Daily range end scheduled separately 74 93 } 75 94 } 76 95 ··· 83 102 durationMillisFromNow = weeklyGoalTime - weeklyCurrent.duration, 84 103 typeId = typeId, 85 104 goalRange = RecordTypeGoal.Range.Weekly, 86 - ) 87 - notificationGoalRangeEndInteractor.schedule( 88 - range = RecordTypeGoal.Range.Weekly, 89 105 ) 90 106 } 91 107 } ··· 101 117 typeId = typeId, 102 118 goalRange = RecordTypeGoal.Range.Monthly, 103 119 ) 104 - notificationGoalRangeEndInteractor.schedule( 105 - range = RecordTypeGoal.Range.Monthly, 106 - ) 107 120 } 108 121 } 109 - } 110 - 111 - override fun cancel(typeId: Long) { 112 - listOf( 113 - RecordTypeGoal.Range.Session, 114 - RecordTypeGoal.Range.Daily, 115 - RecordTypeGoal.Range.Weekly, 116 - RecordTypeGoal.Range.Monthly, 117 - ).forEach { 118 - scheduler.cancelSchedule(typeId, it) 119 - manager.hide(typeId, it) 120 - } 121 - } 122 - 123 - override suspend fun show(typeId: Long, goalRange: RecordTypeGoal.Range) { 124 - notificationGoalParamsInteractor.execute( 125 - typeId = typeId, 126 - range = goalRange, 127 - type = NotificationGoalParamsInteractor.Type.Duration, 128 - )?.let(manager::show) 129 122 } 130 123 }