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.

add record continue

razeeman (Dec 3, 2022, 11:14 AM +0300) 3d517fd7 14595b59

+107 -19
+3 -1
core/src/main/java/com/example/util/simpletimetracker/core/interactor/AddRunningRecordMediator.kt
··· 43 43 typeId: Long, 44 44 tagIds: List<Long>, 45 45 comment: String, 46 + timeStarted: Long? = null, 46 47 ) { 47 48 // Check if multitasking disabled 48 49 if (!prefsInteractor.getAllowMultitasking()) { ··· 53 54 add( 54 55 typeId = typeId, 55 56 comment = comment, 56 - tagIds = tagIds 57 + tagIds = tagIds, 58 + timeStarted = timeStarted, 57 59 ) 58 60 } 59 61
+1
core/src/main/res/values-de/strings.xml
··· 99 99 <string name="change_record_untagged">Nicht markiert</string> 100 100 <string name="change_running_record_removed">Laufende Aktivität entfernt</string> 101 101 <string name="change_record_split">Teilen</string> 102 + <string name="change_record_continue">Fortsetzen</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Aktivität archiviert</string>
+1
core/src/main/res/values-es/strings.xml
··· 99 99 <string name="change_record_untagged">Sin etiquetar</string> 100 100 <string name="change_running_record_removed">Temporizador eliminado</string> 101 101 <string name="change_record_split">Dividir</string> 102 + <string name="change_record_continue">Continuar</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Actividad archivada</string>
+1
core/src/main/res/values-fr/strings.xml
··· 99 99 <string name="change_record_untagged">Non étiqueté</string> 100 100 <string name="change_running_record_removed">Activité en cours d\'exécution supprimée</string> 101 101 <string name="change_record_split">Diviser</string> 102 + <string name="change_record_continue">Continuer</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Activité archivée</string>
+1
core/src/main/res/values-in/strings.xml
··· 99 99 <string name="change_record_untagged">Tidak berlabel</string> 100 100 <string name="change_running_record_removed">Kegiatan berjalan dihapus</string> 101 101 <string name="change_record_split">Membagi</string> 102 + <string name="change_record_continue">Melanjutkan</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Kegiatan dihapuskan</string>
+1
core/src/main/res/values-it/strings.xml
··· 99 99 <string name="change_record_untagged">Non etichettato</string> 100 100 <string name="change_running_record_removed">Attività in corso rimossa</string> 101 101 <string name="change_record_split">Dividere</string> 102 + <string name="change_record_continue">Continua</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Attività archiviata</string>
+1
core/src/main/res/values-ja/strings.xml
··· 99 99 <string name="change_record_untagged">タグを外す</string> 100 100 <string name="change_running_record_removed">記録中のアクティビティを削除</string> 101 101 <string name="change_record_split">分ける</string> 102 + <string name="change_record_continue">継続する</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">アクティビティをアーカイブ</string>
+1
core/src/main/res/values-nl/strings.xml
··· 99 99 <string name="change_record_untagged">Niet gelabeld</string> 100 100 <string name="change_running_record_removed">Lopende activiteit verwijderd</string> 101 101 <string name="change_record_split">Verdeling</string> 102 + <string name="change_record_continue">Doorgaan</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Activiteit gearchiveerd</string>
+1
core/src/main/res/values-pt/strings.xml
··· 99 99 <string name="change_record_untagged">Sem tag</string> 100 100 <string name="change_running_record_removed">Atividade em andamento removida</string> 101 101 <string name="change_record_split">Dividir</string> 102 + <string name="change_record_continue">Continuar</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Atividade arquivada</string>
+1
core/src/main/res/values-ru/strings.xml
··· 99 99 <string name="change_record_untagged">Без тега</string> 100 100 <string name="change_running_record_removed">Текущая активность удалена</string> 101 101 <string name="change_record_split">Разделить</string> 102 + <string name="change_record_continue">Продолжать</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Активность перемещена в архив</string>
+1
core/src/main/res/values-sv/strings.xml
··· 99 99 <string name="change_record_untagged">Ej taggad</string> 100 100 <string name="change_running_record_removed">Pågående aktivitet borttagen</string> 101 101 <string name="change_record_split">Dela upp</string> 102 + <string name="change_record_continue">Fortsätta</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Aktivitet arkiverad</string>
+1
core/src/main/res/values-tr/strings.xml
··· 99 99 <string name="change_record_untagged">Etiketsiz</string> 100 100 <string name="change_running_record_removed">Takip edilen aktivite silindi</string> 101 101 <string name="change_record_split">Bölmek</string> 102 + <string name="change_record_continue">Devam et</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Aktivite arşivlendi</string>
+1
core/src/main/res/values-uk/strings.xml
··· 99 99 <string name="change_record_untagged">Без тегу</string> 100 100 <string name="change_running_record_removed">Поточне заняття видалено</string> 101 101 <string name="change_record_split">Розділити</string> 102 + <string name="change_record_continue">Продовжити</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Активність переміщено до архіву</string>
+1
core/src/main/res/values-zh/strings.xml
··· 99 99 <string name="change_record_untagged">无标签</string> 100 100 <string name="change_running_record_removed">正在追踪的活动已删除</string> 101 101 <string name="change_record_split">划分</string> 102 + <string name="change_record_continue">继续</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">活动已存档</string>
+1
core/src/main/res/values/strings.xml
··· 99 99 <string name="change_record_untagged">Untagged</string> 100 100 <string name="change_running_record_removed">Running activity removed</string> 101 101 <string name="change_record_split">Divide</string> 102 + <string name="change_record_continue">Continue</string> 102 103 103 104 <!-- Change record type --> 104 105 <string name="change_record_type_archived">Activity archived</string>
+2
features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/view/ChangeRecordCore.kt
··· 115 115 containerChangeRecordTimeSplitAdjust.listener = viewModel::onAdjustTimeSplitItemClick 116 116 btnChangeRecordSave.setOnClick(viewModel::onSaveClick) 117 117 btnChangeRecordSplit.setOnClick(viewModel::onSplitClick) 118 + btnChangeRecordContinue.setOnClick(viewModel::onContinueClick) 118 119 } 119 120 120 121 fun <T : ViewBinding> initViewModel( ··· 132 133 categories.observe(categoriesAdapter::replace) 133 134 saveButtonEnabled.observe(btnChangeRecordSave::setEnabled) 134 135 splitButtonEnabled.observe(btnChangeRecordSplit::setEnabled) 136 + continueButtonEnabled.observe(btnChangeRecordContinue::setEnabled) 135 137 timeAdjustmentItems.observe(containerChangeRecordTimeAdjust.adapter::replace) 136 138 timeSplitAdjustmentItems.observe(containerChangeRecordTimeSplitAdjust.adapter::replace) 137 139 chooserState.observe { updateChooserState(it, binding) }
+31 -16
features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt
··· 82 82 val timeSplitText: LiveData<String> = MutableLiveData() 83 83 val saveButtonEnabled: LiveData<Boolean> = MutableLiveData(true) 84 84 val splitButtonEnabled: LiveData<Boolean> = MutableLiveData(true) 85 + val continueButtonEnabled: LiveData<Boolean> = MutableLiveData(true) 85 86 val keyboardVisibility: LiveData<Boolean> = MutableLiveData(false) 86 87 val comment: LiveData<String> = MutableLiveData() 87 88 ··· 100 101 protected abstract fun onTimeSplitChanged() 101 102 protected abstract suspend fun onSaveClickDelegate() 102 103 protected abstract suspend fun onSplitClickDelegate() 104 + protected open suspend fun onContinueClickDelegate() {} 103 105 104 106 fun onTypeChooserClick() { 105 107 onNewChooserState(ChangeRecordChooserState.State.Activity) ··· 130 132 } 131 133 132 134 fun onSaveClick() { 133 - if (newTypeId == 0L) { 134 - showMessage(R.string.change_record_message_choose_type) 135 - return 136 - } 137 - viewModelScope.launch { 138 - saveButtonEnabled.set(false) 139 - onSaveClickDelegate() 140 - } 135 + onRecordChangeButtonClick( 136 + buttonEnabledLiveData = saveButtonEnabled, 137 + onProceed = ::onSaveClickDelegate, 138 + ) 141 139 } 142 140 143 141 fun onSplitClick() { 144 - if (newTypeId == 0L) { 145 - showMessage(R.string.change_record_message_choose_type) 146 - return 147 - } 148 - viewModelScope.launch { 149 - splitButtonEnabled.set(false) 150 - onSplitClickDelegate() 151 - } 142 + onRecordChangeButtonClick( 143 + buttonEnabledLiveData = splitButtonEnabled, 144 + onProceed = ::onSplitClickDelegate, 145 + ) 146 + } 147 + 148 + fun onContinueClick() { 149 + onRecordChangeButtonClick( 150 + buttonEnabledLiveData = continueButtonEnabled, 151 + onProceed = ::onContinueClickDelegate, 152 + ) 152 153 } 153 154 154 155 fun onTypeClick(item: RecordTypeViewData) { ··· 290 291 } 291 292 } 292 293 updateTimeSplitValue() 294 + } 295 + } 296 + 297 + private fun onRecordChangeButtonClick( 298 + buttonEnabledLiveData: LiveData<Boolean>, 299 + onProceed: suspend () -> Unit, 300 + ) { 301 + if (newTypeId == 0L) { 302 + showMessage(R.string.change_record_message_choose_type) 303 + return 304 + } 305 + viewModelScope.launch { 306 + buttonEnabledLiveData.set(false) 307 + onProceed() 293 308 } 294 309 } 295 310
+30 -2
features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordViewModel.kt
··· 3 3 import androidx.lifecycle.LiveData 4 4 import androidx.lifecycle.MutableLiveData 5 5 import androidx.lifecycle.viewModelScope 6 + import com.example.util.simpletimetracker.core.extension.set 7 + import com.example.util.simpletimetracker.core.interactor.AddRunningRecordMediator 6 8 import com.example.util.simpletimetracker.core.interactor.RecordTagViewDataInteractor 7 9 import com.example.util.simpletimetracker.core.interactor.RecordTypesViewDataInteractor 10 + import com.example.util.simpletimetracker.core.interactor.RemoveRunningRecordMediator 8 11 import com.example.util.simpletimetracker.core.interactor.WidgetInteractor 9 12 import com.example.util.simpletimetracker.core.mapper.TimeMapper 10 13 import com.example.util.simpletimetracker.core.repo.ResourceRepo 11 14 import com.example.util.simpletimetracker.domain.extension.orZero 12 15 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 13 16 import com.example.util.simpletimetracker.domain.interactor.RecordInteractor 17 + import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor 14 18 import com.example.util.simpletimetracker.domain.model.RangeLength 15 19 import com.example.util.simpletimetracker.domain.model.Record 16 20 import com.example.util.simpletimetracker.domain.model.WidgetType ··· 32 36 private val router: Router, 33 37 private val recordInteractor: RecordInteractor, 34 38 private val changeRecordViewDataInteractor: ChangeRecordViewDataInteractor, 39 + private val runningRecordInteractor: RunningRecordInteractor, 40 + private val addRunningRecordMediator: AddRunningRecordMediator, 41 + private val removeRunningRecordMediator: RemoveRunningRecordMediator, 35 42 private val timeMapper: TimeMapper, 36 43 private val widgetInteractor: WidgetInteractor, 37 44 ) : ChangeRecordBaseViewModel( ··· 60 67 } 61 68 62 69 fun onDeleteClick() { 63 - (keyboardVisibility as MutableLiveData).value = false 70 + keyboardVisibility.set(false) 64 71 router.back() 65 72 } 66 73 ··· 77 84 ).let { 78 85 recordInteractor.add(it) 79 86 widgetInteractor.updateWidgets(listOf(WidgetType.STATISTICS_CHART)) 80 - (keyboardVisibility as MutableLiveData).value = false 87 + keyboardVisibility.set(false) 81 88 router.back() 82 89 } 83 90 } ··· 95 102 } 96 103 newTimeStarted = newTimeSplit 97 104 onSaveClick() 105 + } 106 + 107 + override suspend fun onContinueClickDelegate() { 108 + // Remove current record if exist. 109 + (extra as? ChangeRecordParams.Tracked)?.id?.let { 110 + recordInteractor.remove(it) 111 + widgetInteractor.updateWidgets(listOf(WidgetType.STATISTICS_CHART)) 112 + } 113 + // Stop same type running record if exist (only one of the same type can run at once). 114 + runningRecordInteractor.get(newTypeId) 115 + ?.let { removeRunningRecordMediator.removeWithRecordAdd(it) } 116 + // Add new running record. 117 + addRunningRecordMediator.startTimer( 118 + typeId = newTypeId, 119 + timeStarted = newTimeStarted, 120 + comment = newComment, 121 + tagIds = newCategoryIds, 122 + ) 123 + // Exit. 124 + keyboardVisibility.set(false) 125 + router.back() 98 126 } 99 127 100 128 override fun getChangeCategoryParams(data: ChangeTagData): ChangeRecordTagFromScreen {
+24
features/feature_change_record/src/main/res/layout/change_record_core_layout.xml
··· 367 367 android:id="@+id/containerChangeRecordSplit" 368 368 android:layout_width="match_parent" 369 369 android:layout_height="wrap_content" 370 + android:layout_marginTop="16dp" 370 371 android:animateLayoutChanges="true"> 371 372 372 373 <androidx.cardview.widget.CardView ··· 444 445 app:layout_constraintEnd_toEndOf="parent" 445 446 app:layout_constraintStart_toEndOf="@id/fieldChangeRecordTimeSplit" 446 447 app:layout_constraintTop_toTopOf="@id/fieldChangeRecordTimeSplit" /> 448 + 449 + </androidx.constraintlayout.widget.ConstraintLayout> 450 + 451 + <androidx.constraintlayout.widget.ConstraintLayout 452 + android:id="@+id/containerChangeRecordContinue" 453 + android:layout_width="match_parent" 454 + android:layout_height="wrap_content"> 455 + 456 + <com.example.util.simpletimetracker.feature_views.DividerView 457 + android:id="@+id/dividerChangeRecordContinue" 458 + android:layout_width="match_parent" 459 + android:layout_height="wrap_content" 460 + android:layout_marginTop="16dp" 461 + app:layout_constraintTop_toTopOf="parent" /> 462 + 463 + <com.google.android.material.button.MaterialButton 464 + android:id="@+id/btnChangeRecordContinue" 465 + style="@style/AppButtonActive" 466 + android:layout_width="match_parent" 467 + android:layout_marginStart="8dp" 468 + android:layout_marginEnd="8dp" 469 + android:text="@string/change_record_continue" 470 + app:layout_constraintTop_toBottomOf="@id/dividerChangeRecordContinue" /> 447 471 448 472 </androidx.constraintlayout.widget.ConstraintLayout> 449 473
+3
features/feature_change_running_record/src/main/java/com/example/util/simpletimetracker/feature_change_running_record/view/ChangeRunningRecordFragment.kt
··· 50 50 } 51 51 52 52 override fun initUi(): Unit = with(binding) { 53 + // No time ended in running record. 53 54 layoutChangeRunningRecordCore.fieldChangeRecordTimeEnded.isVisible = false 54 55 layoutChangeRunningRecordCore.btnChangeRecordTimeEndedAdjust.isVisible = false 56 + // Can't continue running record. 57 + layoutChangeRunningRecordCore.containerChangeRecordContinue.isVisible = false 55 58 56 59 postponeEnterTransition() 57 60