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 time adjustment to change running record

razeeman (Jun 26, 2022, 3:03 PM +0300) 5bbff214 fabe287f

+164 -20
+2 -1
app/src/main/java/com/example/util/simpletimetracker/navigation/NotificationResolverImpl.kt
··· 32 32 val snackBar = Snackbar.make( 33 33 activity.findViewById(android.R.id.content), 34 34 data.message, 35 - SNACK_BAR_DURATION_MS 35 + if (data.isShortDuration) SNACK_BAR_SHORT_DURATION_MS else SNACK_BAR_DURATION_MS 36 36 ) 37 37 38 38 val textViewId = com.google.android.material.R.id.snackbar_text ··· 61 61 62 62 companion object { 63 63 private const val SNACK_BAR_DURATION_MS = 5000 64 + private const val SNACK_BAR_SHORT_DURATION_MS = 2000 64 65 } 65 66 }
+1
core/src/main/res/values-de/strings.xml
··· 44 44 <string name="record_types_empty">Keine Aktivitäten hinzugefügt</string> 45 45 <string name="record_tag_selection_hint">Wählen Sie ein Datensatz-Tag aus</string> 46 46 <string name="time_now">Jetzt</string> 47 + <string name="cannot_be_in_the_future">Die Zeit kann nicht in der Zukunft liegen</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Eintrag %s entfernt</string>
+1
core/src/main/res/values-es/strings.xml
··· 44 44 <string name="record_types_empty">No se añadieron actividades</string> 45 45 <string name="record_tag_selection_hint">Seleccione etiqueta</string> 46 46 <string name="time_now">Ahora</string> 47 + <string name="cannot_be_in_the_future">El tiempo no puede estar en el futuro</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Registro %s eliminado</string>
+1
core/src/main/res/values-fr/strings.xml
··· 44 44 <string name="record_types_empty">Aucune activité ajoutée</string> 45 45 <string name="record_tag_selection_hint">Sélectionnez une étiquette à l\'enregistrement</string> 46 46 <string name="time_now">À présent</string> 47 + <string name="cannot_be_in_the_future">Le temps ne peut pas être dans le futur</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Enregistrement %s supprimé</string>
+1
core/src/main/res/values-in/strings.xml
··· 44 44 <string name="record_types_empty">Tidak ada kegiatan yang ditambahkan</string> 45 45 <string name="record_tag_selection_hint">Pilih label rekaman</string> 46 46 <string name="time_now">Sekarang</string> 47 + <string name="cannot_be_in_the_future">Waktu tidak bisa di masa depan</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Rekor %s dihapuskan</string>
+1
core/src/main/res/values-it/strings.xml
··· 44 44 <string name="record_types_empty">Nessuna attività aggiunta</string> 45 45 <string name="record_tag_selection_hint">Seleziona etichetta per la registrazione</string> 46 46 <string name="time_now">Adesso</string> 47 + <string name="cannot_be_in_the_future">Il tempo non può essere nel futuro</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Registrazione %s rimossa</string>
+1
core/src/main/res/values-pt/strings.xml
··· 44 44 <string name="record_types_empty">Nenhuma atividade adicionada</string> 45 45 <string name="record_tag_selection_hint">Selecione uma tag de registro</string> 46 46 <string name="time_now">Agora</string> 47 + <string name="cannot_be_in_the_future">O tempo não pode estar no futuro</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Registro %s removido</string>
+1
core/src/main/res/values-ru/strings.xml
··· 44 44 <string name="record_types_empty">Активности не добавлены</string> 45 45 <string name="record_tag_selection_hint">Выберите тег для записи</string> 46 46 <string name="time_now">Сейчас</string> 47 + <string name="cannot_be_in_the_future">Время не может быть в будущем</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Запись %s удалена</string>
+1
core/src/main/res/values-sv/strings.xml
··· 44 44 <string name="record_types_empty">Inga tillagda aktiviteter</string> 45 45 <string name="record_tag_selection_hint">Välj händelsetagg</string> 46 46 <string name="time_now">Nu</string> 47 + <string name="cannot_be_in_the_future">Tid kan inte vara i framtiden</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Händelse %s borttagen</string>
+1
core/src/main/res/values-tr/strings.xml
··· 44 44 <string name="record_types_empty">Aktivite eklenmedi</string> 45 45 <string name="record_tag_selection_hint">Kayıt etiketi seçin</string> 46 46 <string name="time_now">Şimdi</string> 47 + <string name="cannot_be_in_the_future">Zaman gelecekte olamaz</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Kayıt silindi: %s</string>
+1
core/src/main/res/values-uk/strings.xml
··· 44 44 <string name="record_types_empty">Жодної активності не додано</string> 45 45 <string name="record_tag_selection_hint">Виберіть тег запису</string> 46 46 <string name="time_now">Тепер</string> 47 + <string name="cannot_be_in_the_future">Час не може бути в майбутньому</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Запис %s видалено</string>
+1
core/src/main/res/values-zh/strings.xml
··· 44 44 <string name="record_types_empty">未添加任何活动</string> 45 45 <string name="record_tag_selection_hint">选择记录标签</string> 46 46 <string name="time_now">现在</string> 47 + <string name="cannot_be_in_the_future">时间不可能在未来</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">记录 %s 已删除</string>
+1
core/src/main/res/values/strings.xml
··· 44 44 <string name="record_types_empty">No activities added</string> 45 45 <string name="record_tag_selection_hint">Select record tag</string> 46 46 <string name="time_now">Now</string> 47 + <string name="cannot_be_in_the_future">Time cannot be in the future</string> 47 48 48 49 <!-- Records --> 49 50 <string name="record_removed">Record %s removed</string>
+3 -3
features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/customView/TimeAdjustmentView.kt core/src/main/java/com/example/util/simpletimetracker/core/view/timeAdjustment/TimeAdjustmentView.kt
··· 1 - package com.example.util.simpletimetracker.feature_change_record.customView 1 + package com.example.util.simpletimetracker.core.view.timeAdjustment 2 2 3 3 import android.content.Context 4 4 import android.util.AttributeSet 5 5 import android.view.LayoutInflater 6 6 import android.widget.FrameLayout 7 + import com.example.util.simpletimetracker.core.databinding.TimeAdjustmentItemLayoutBinding 8 + import com.example.util.simpletimetracker.core.databinding.TimeAdjustmentViewLayoutBinding 7 9 import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter 8 10 import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 9 11 import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate 10 - import com.example.util.simpletimetracker.feature_change_record.databinding.TimeAdjustmentItemLayoutBinding 11 - import com.example.util.simpletimetracker.feature_change_record.databinding.TimeAdjustmentViewLayoutBinding 12 12 import com.example.util.simpletimetracker.feature_views.extension.setOnClickWith 13 13 import com.google.android.flexbox.FlexDirection 14 14 import com.google.android.flexbox.FlexWrap
+1 -1
features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/interactor/ChangeRecordViewDataInteractor.kt
··· 8 8 import com.example.util.simpletimetracker.domain.model.Record 9 9 import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 10 10 import com.example.util.simpletimetracker.feature_change_record.R 11 - import com.example.util.simpletimetracker.feature_change_record.customView.TimeAdjustmentView 11 + import com.example.util.simpletimetracker.core.view.timeAdjustment.TimeAdjustmentView 12 12 import com.example.util.simpletimetracker.feature_change_record.mapper.ChangeRecordViewDataMapper 13 13 import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordCommentViewData 14 14 import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordViewData
+2 -4
features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordViewModel.kt
··· 23 23 import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData 24 24 import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData 25 25 import com.example.util.simpletimetracker.feature_change_record.R 26 - import com.example.util.simpletimetracker.feature_change_record.customView.TimeAdjustmentView 26 + import com.example.util.simpletimetracker.core.view.timeAdjustment.TimeAdjustmentView 27 27 import com.example.util.simpletimetracker.feature_change_record.interactor.ChangeRecordViewDataInteractor 28 28 import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordCommentViewData 29 29 import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordViewData ··· 88 88 val timeAdjustmentItems: LiveData<List<ViewHolderType>> by lazy { 89 89 MutableLiveData(loadTimeAdjustmentItems()) 90 90 } 91 - val timeAdjustmentState: LiveData<TimeAdjustmentState> by lazy { 92 - MutableLiveData(TimeAdjustmentState.HIDDEN) 93 - } 91 + val timeAdjustmentState: LiveData<TimeAdjustmentState> = MutableLiveData(TimeAdjustmentState.HIDDEN) 94 92 val flipTypesChooser: LiveData<Boolean> = MutableLiveData() 95 93 val flipCategoryChooser: LiveData<Boolean> = MutableLiveData() 96 94 val flipLastCommentsChooser: LiveData<Boolean> = MutableLiveData()
+1 -1
features/feature_change_record/src/main/res/layout/change_record_fragment.xml
··· 167 167 168 168 </androidx.cardview.widget.CardView> 169 169 170 - <com.example.util.simpletimetracker.feature_change_record.customView.TimeAdjustmentView 170 + <com.example.util.simpletimetracker.core.view.timeAdjustment.TimeAdjustmentView 171 171 android:id="@+id/containerChangeRecordTimeAdjust" 172 172 android:layout_width="match_parent" 173 173 android:layout_height="wrap_content"
features/feature_change_record/src/main/res/layout/time_adjustment_item_layout.xml core/src/main/res/layout/time_adjustment_item_layout.xml
features/feature_change_record/src/main/res/layout/time_adjustment_view_layout.xml core/src/main/res/layout/time_adjustment_view_layout.xml
+18 -1
features/feature_change_running_record/src/main/java/com/example/util/simpletimetracker/feature_change_running_record/interactor/ChangeRunningRecordViewDataInteractor.kt
··· 1 1 package com.example.util.simpletimetracker.feature_change_running_record.interactor 2 2 3 + import com.example.util.simpletimetracker.core.repo.ResourceRepo 4 + import com.example.util.simpletimetracker.core.view.timeAdjustment.TimeAdjustmentView 3 5 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 4 6 import com.example.util.simpletimetracker.domain.interactor.RecordTagInteractor 5 7 import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor 6 8 import com.example.util.simpletimetracker.domain.model.RunningRecord 9 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 10 + import com.example.util.simpletimetracker.feature_change_running_record.R 7 11 import com.example.util.simpletimetracker.feature_change_running_record.mapper.ChangeRunningRecordViewDataMapper 8 12 import com.example.util.simpletimetracker.feature_change_running_record.viewData.ChangeRunningRecordViewData 9 13 import javax.inject.Inject ··· 12 16 private val prefsInteractor: PrefsInteractor, 13 17 private val recordTypeInteractor: RecordTypeInteractor, 14 18 private val recordTagInteractor: RecordTagInteractor, 15 - private val changeRunningRecordViewDataMapper: ChangeRunningRecordViewDataMapper 19 + private val changeRunningRecordViewDataMapper: ChangeRunningRecordViewDataMapper, 20 + private val resourceRepo: ResourceRepo, 16 21 ) { 17 22 18 23 suspend fun getPreviewViewData(record: RunningRecord): ChangeRunningRecordViewData { ··· 27 32 recordTags = tags, 28 33 isDarkTheme = isDarkTheme, 29 34 useMilitaryTime = useMilitaryTime 35 + ) 36 + } 37 + 38 + fun getTimeAdjustmentItems(): List<ViewHolderType> { 39 + return listOf( 40 + TimeAdjustmentView.ViewData.Now(text = resourceRepo.getString(R.string.time_now)), 41 + TimeAdjustmentView.ViewData.Adjust(text = "-30", value = -30), 42 + TimeAdjustmentView.ViewData.Adjust(text = "-5", value = -5), 43 + TimeAdjustmentView.ViewData.Adjust(text = "-1", value = -1), 44 + TimeAdjustmentView.ViewData.Adjust(text = "+1", value = +1), 45 + TimeAdjustmentView.ViewData.Adjust(text = "+5", value = +5), 46 + TimeAdjustmentView.ViewData.Adjust(text = "+30", value = +30), 30 47 ) 31 48 } 32 49 }
+20
features/feature_change_running_record/src/main/java/com/example/util/simpletimetracker/feature_change_running_record/view/ChangeRunningRecordFragment.kt
··· 28 28 import com.example.util.simpletimetracker.feature_views.extension.rotateUp 29 29 import com.example.util.simpletimetracker.feature_views.extension.setOnClick 30 30 import com.example.util.simpletimetracker.feature_views.extension.visible 31 + import com.example.util.simpletimetracker.navigation.Router 32 + import com.example.util.simpletimetracker.navigation.params.notification.SnackBarParams 31 33 import com.example.util.simpletimetracker.navigation.params.screen.ChangeRunningRecordParams 32 34 import com.google.android.flexbox.FlexDirection 33 35 import com.google.android.flexbox.FlexWrap ··· 47 49 48 50 @Inject 49 51 lateinit var viewModelFactory: BaseViewModelFactory<ChangeRunningRecordViewModel> 52 + 53 + @Inject 54 + lateinit var router: Router 50 55 51 56 private val viewModel: ChangeRunningRecordViewModel by viewModels( 52 57 factoryProducer = { viewModelFactory } ··· 102 107 fieldChangeRunningRecordTimeStarted.setOnClick(viewModel::onTimeStartedClick) 103 108 btnChangeRunningRecordSave.setOnClick(viewModel::onSaveClick) 104 109 btnChangeRunningRecordDelete.setOnClick(viewModel::onDeleteClick) 110 + btnChangeRunningRecordTimeStartedAdjust.setOnClick(viewModel::onAdjustTimeStartedClick) 111 + containerChangeRunningRecordTimeAdjust.listener = viewModel::onAdjustTimeItemClick 105 112 } 106 113 107 114 override fun initViewModel() = with(binding) { ··· 130 137 keyboardVisibility.observe { visible -> 131 138 if (visible) showKeyboard(etChangeRunningRecordComment) else hideKeyboard() 132 139 } 140 + timeAdjustmentState.observe { isVisible -> 141 + containerChangeRunningRecordTimeAdjust.visible = isVisible 142 + btnChangeRunningRecordTimeStartedAdjust.setChooserColor(isVisible) 143 + } 144 + timeAdjustmentItems.observe(containerChangeRunningRecordTimeAdjust.adapter::replace) 145 + message.observe(::showMessage) 133 146 } 134 147 } 135 148 ··· 178 191 itemComment = item.comment 179 192 } 180 193 tvChangeRunningRecordTimeStarted.text = item.dateTimeStarted 194 + } 195 + 196 + private fun showMessage(message: SnackBarParams?) { 197 + if (message != null) { 198 + router.show(message, binding.btnChangeRunningRecordSave) 199 + viewModel.onMessageShown() 200 + } 181 201 } 182 202 183 203 companion object {
+55 -7
features/feature_change_running_record/src/main/java/com/example/util/simpletimetracker/feature_change_running_record/viewModel/ChangeRunningRecordViewModel.kt
··· 5 5 import androidx.lifecycle.ViewModel 6 6 import androidx.lifecycle.viewModelScope 7 7 import com.example.util.simpletimetracker.core.extension.addOrRemove 8 - import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 9 - import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData 10 8 import com.example.util.simpletimetracker.core.extension.set 11 9 import com.example.util.simpletimetracker.core.interactor.AddRunningRecordMediator 12 10 import com.example.util.simpletimetracker.core.interactor.RecordTagViewDataInteractor 13 11 import com.example.util.simpletimetracker.core.interactor.RecordTypesViewDataInteractor 14 12 import com.example.util.simpletimetracker.core.interactor.RemoveRunningRecordMediator 15 13 import com.example.util.simpletimetracker.core.repo.ResourceRepo 16 - import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData 14 + import com.example.util.simpletimetracker.core.view.timeAdjustment.TimeAdjustmentView 17 15 import com.example.util.simpletimetracker.domain.extension.flip 16 + import com.example.util.simpletimetracker.domain.extension.orFalse 18 17 import com.example.util.simpletimetracker.domain.extension.orTrue 19 18 import com.example.util.simpletimetracker.domain.extension.orZero 20 19 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 21 20 import com.example.util.simpletimetracker.domain.interactor.RunningRecordInteractor 22 21 import com.example.util.simpletimetracker.domain.model.RunningRecord 22 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 23 + import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData 24 + import com.example.util.simpletimetracker.feature_base_adapter.recordType.RecordTypeViewData 23 25 import com.example.util.simpletimetracker.feature_change_running_record.R 24 26 import com.example.util.simpletimetracker.feature_change_running_record.interactor.ChangeRunningRecordViewDataInteractor 25 27 import com.example.util.simpletimetracker.feature_change_running_record.viewData.ChangeRunningRecordViewData 26 28 import com.example.util.simpletimetracker.navigation.Router 29 + import com.example.util.simpletimetracker.navigation.params.notification.SnackBarParams 30 + import com.example.util.simpletimetracker.navigation.params.notification.ToastParams 27 31 import com.example.util.simpletimetracker.navigation.params.screen.ChangeRunningRecordParams 28 32 import com.example.util.simpletimetracker.navigation.params.screen.DateTimeDialogParams 29 33 import com.example.util.simpletimetracker.navigation.params.screen.DateTimeDialogType 30 - import com.example.util.simpletimetracker.navigation.params.notification.ToastParams 31 34 import kotlinx.coroutines.Job 32 35 import kotlinx.coroutines.cancelAndJoin 33 36 import kotlinx.coroutines.delay 34 37 import kotlinx.coroutines.isActive 35 38 import kotlinx.coroutines.launch 39 + import java.util.concurrent.TimeUnit 36 40 import javax.inject.Inject 37 41 38 42 class ChangeRunningRecordViewModel @Inject constructor( ··· 72 76 initial 73 77 } 74 78 } 79 + val timeAdjustmentItems: LiveData<List<ViewHolderType>> by lazy { 80 + MutableLiveData(loadTimeAdjustmentItems()) 81 + } 82 + val timeAdjustmentState: LiveData<Boolean> = MutableLiveData(false) 83 + val message: LiveData<SnackBarParams?> = MutableLiveData() 75 84 val flipTypesChooser: LiveData<Boolean> = MutableLiveData() 76 85 val flipCategoryChooser: LiveData<Boolean> = MutableLiveData() 77 86 val deleteButtonEnabled: LiveData<Boolean> = MutableLiveData(true) ··· 173 182 } 174 183 175 184 fun onDateTimeSet(timestamp: Long, tag: String?) { 176 - // TODO block selection on chooser or show message if timestamp in the future? 177 - val currentTime = System.currentTimeMillis() 178 185 viewModelScope.launch { 179 186 when (tag) { 180 187 TIME_STARTED_TAG -> { 181 188 if (timestamp != newTimeStarted) { 182 - newTimeStarted = timestamp.takeIf { it < currentTime } ?: currentTime 189 + newTimeStarted = timestamp 190 + checkTimeStarted() 183 191 updatePreview() 184 192 } 185 193 } ··· 196 204 } 197 205 } 198 206 207 + fun onAdjustTimeStartedClick() { 208 + val newValue = timeAdjustmentState.value.orFalse().flip() 209 + timeAdjustmentState.set(newValue) 210 + } 211 + 212 + fun onAdjustTimeItemClick(viewData: TimeAdjustmentView.ViewData) { 213 + viewModelScope.launch { 214 + when (viewData) { 215 + is TimeAdjustmentView.ViewData.Now -> { 216 + newTimeStarted = System.currentTimeMillis() 217 + updatePreview() 218 + } 219 + is TimeAdjustmentView.ViewData.Adjust -> { 220 + newTimeStarted += TimeUnit.MINUTES.toMillis(viewData.value) 221 + checkTimeStarted() 222 + updatePreview() 223 + } 224 + } 225 + } 226 + } 227 + 199 228 fun onVisible() { 200 229 startUpdate() 201 230 } 202 231 203 232 fun onHidden() { 204 233 stopUpdate() 234 + } 235 + 236 + fun onMessageShown() { 237 + message.set(null) 238 + } 239 + 240 + private fun checkTimeStarted() { 241 + if (newTimeStarted > System.currentTimeMillis()) { 242 + newTimeStarted = System.currentTimeMillis() 243 + 244 + SnackBarParams( 245 + message = resourceRepo.getString(R.string.cannot_be_in_the_future), 246 + isShortDuration = true 247 + ).let(message::set) 248 + } 205 249 } 206 250 207 251 private suspend fun updatePreview() { ··· 247 291 typeId = newTypeId, 248 292 multipleChoiceAvailable = true, 249 293 ) 294 + } 295 + 296 + private fun loadTimeAdjustmentItems(): List<ViewHolderType> { 297 + return changeRunningRecordViewDataInteractor.getTimeAdjustmentItems() 250 298 } 251 299 252 300 private fun startUpdate() {
+49 -2
features/feature_change_running_record/src/main/res/layout/change_running_record_fragment.xml
··· 64 64 65 65 </androidx.cardview.widget.CardView> 66 66 67 + <Space 68 + android:id="@+id/spaceChangeRunningRecordTimeStartedEnd" 69 + android:layout_width="8dp" 70 + android:layout_height="wrap_content" 71 + app:layout_constraintStart_toEndOf="@id/fieldChangeRunningRecordTimeStarted" 72 + app:layout_constraintTop_toTopOf="@id/fieldChangeRunningRecordTimeStarted" /> 73 + 74 + <Space 75 + android:id="@+id/spaceChangeRunningRecordTimeStartedTop" 76 + android:layout_width="wrap_content" 77 + android:layout_height="8dp" 78 + app:layout_constraintBottom_toTopOf="@id/fieldChangeRunningRecordTimeStarted" 79 + app:layout_constraintEnd_toEndOf="@id/fieldChangeRunningRecordTimeStarted" /> 80 + 81 + <androidx.cardview.widget.CardView 82 + android:id="@+id/btnChangeRunningRecordTimeStartedAdjust" 83 + style="@style/InputFieldCard" 84 + android:layout_width="wrap_content" 85 + android:layout_height="wrap_content" 86 + app:layout_constraintEnd_toEndOf="@id/spaceChangeRunningRecordTimeStartedEnd" 87 + app:layout_constraintTop_toTopOf="@id/spaceChangeRunningRecordTimeStartedTop"> 88 + 89 + <androidx.appcompat.widget.AppCompatTextView 90 + android:layout_width="30dp" 91 + android:layout_height="30dp" 92 + android:background="?appInputFieldBorder" 93 + android:gravity="center" 94 + android:padding="4dp" 95 + android:text="+/-" 96 + android:textColor="?appTextHintColor" 97 + android:textStyle="bold" 98 + app:autoSizeMinTextSize="1sp" 99 + app:autoSizeTextType="uniform" /> 100 + 101 + </androidx.cardview.widget.CardView> 102 + 103 + <com.example.util.simpletimetracker.core.view.timeAdjustment.TimeAdjustmentView 104 + android:id="@+id/containerChangeRunningRecordTimeAdjust" 105 + android:layout_width="match_parent" 106 + android:layout_height="wrap_content" 107 + android:layout_marginStart="@dimen/input_field_margin" 108 + android:layout_marginEnd="@dimen/input_field_margin" 109 + android:visibility="gone" 110 + app:layout_constraintStart_toStartOf="parent" 111 + app:layout_constraintTop_toBottomOf="@id/fieldChangeRunningRecordTimeStarted" 112 + tools:visibility="visible" /> 113 + 67 114 <androidx.cardview.widget.CardView 68 115 android:id="@+id/fieldChangeRunningRecordType" 69 116 style="@style/InputFieldCard" ··· 74 121 android:layout_marginEnd="4dp" 75 122 app:layout_constraintEnd_toStartOf="@id/fieldChangeRunningRecordCategory" 76 123 app:layout_constraintStart_toStartOf="parent" 77 - app:layout_constraintTop_toBottomOf="@id/fieldChangeRunningRecordTimeStarted"> 124 + app:layout_constraintTop_toBottomOf="@id/containerChangeRunningRecordTimeAdjust"> 78 125 79 126 <androidx.constraintlayout.widget.ConstraintLayout 80 127 android:layout_width="match_parent" ··· 116 163 android:layout_marginEnd="@dimen/input_field_margin" 117 164 app:layout_constraintEnd_toEndOf="parent" 118 165 app:layout_constraintStart_toEndOf="@id/fieldChangeRunningRecordType" 119 - app:layout_constraintTop_toBottomOf="@id/fieldChangeRunningRecordTimeStarted"> 166 + app:layout_constraintTop_toBottomOf="@id/containerChangeRunningRecordTimeAdjust"> 120 167 121 168 <androidx.constraintlayout.widget.ConstraintLayout 122 169 android:layout_width="match_parent"
+1
navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/notification/SnackBarParams.kt
··· 3 3 data class SnackBarParams( 4 4 val tag: TAG? = null, 5 5 val message: String, 6 + val isShortDuration: Boolean = false, 6 7 val dismissedListener: ((TAG?) -> Unit)? = null, 7 8 val actionText: String = "", 8 9 val actionListener: ((TAG?) -> Unit)? = null