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.

improve change record shared transitions

razeeman (Feb 6, 2021, 3:29 PM +0300) 32133f44 28dad3be

+97 -71
-25
feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/extra/ChangeRecordExtra.kt
··· 1 - package com.example.util.simpletimetracker.feature_change_record.extra 2 - 3 - import android.os.Parcelable 4 - import kotlinx.android.parcel.Parcelize 5 - 6 - sealed class ChangeRecordExtra : Parcelable { 7 - 8 - @Parcelize 9 - data class Tracked( 10 - val transitionName: String, 11 - val id: Long 12 - ) : ChangeRecordExtra() 13 - 14 - @Parcelize 15 - data class Untracked( 16 - val transitionName: String, 17 - val timeStarted: Long, 18 - val timeEnded: Long 19 - ) : ChangeRecordExtra() 20 - 21 - @Parcelize 22 - data class New( 23 - val daysFromToday: Int = 0 24 - ) : ChangeRecordExtra() 25 - }
+38 -29
feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/view/ChangeRecordFragment.kt
··· 22 22 import com.example.util.simpletimetracker.feature_change_record.R 23 23 import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordAdapter 24 24 import com.example.util.simpletimetracker.feature_change_record.di.ChangeRecordComponentProvider 25 - import com.example.util.simpletimetracker.feature_change_record.extra.ChangeRecordExtra 26 25 import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordViewData 27 26 import com.example.util.simpletimetracker.feature_change_record.viewModel.ChangeRecordViewModel 28 27 import com.example.util.simpletimetracker.navigation.params.ChangeRecordParams ··· 30 29 import com.google.android.flexbox.FlexWrap 31 30 import com.google.android.flexbox.FlexboxLayoutManager 32 31 import com.google.android.flexbox.JustifyContent 33 - import kotlinx.android.synthetic.main.change_record_fragment.* 32 + import kotlinx.android.synthetic.main.change_record_fragment.arrowChangeRecordType 33 + import kotlinx.android.synthetic.main.change_record_fragment.btnChangeRecordDelete 34 + import kotlinx.android.synthetic.main.change_record_fragment.btnChangeRecordSave 35 + import kotlinx.android.synthetic.main.change_record_fragment.etChangeRecordComment 36 + import kotlinx.android.synthetic.main.change_record_fragment.fieldChangeRecordTimeEnded 37 + import kotlinx.android.synthetic.main.change_record_fragment.fieldChangeRecordTimeStarted 38 + import kotlinx.android.synthetic.main.change_record_fragment.fieldChangeRecordType 39 + import kotlinx.android.synthetic.main.change_record_fragment.previewChangeRecord 40 + import kotlinx.android.synthetic.main.change_record_fragment.rvChangeRecordType 41 + import kotlinx.android.synthetic.main.change_record_fragment.tvChangeRecordTimeEnded 42 + import kotlinx.android.synthetic.main.change_record_fragment.tvChangeRecordTimeStarted 34 43 import javax.inject.Inject 35 44 36 45 class ChangeRecordFragment : BaseFragment(R.layout.change_record_fragment), ··· 52 61 private val typesAdapter: ChangeRecordAdapter by lazy { 53 62 ChangeRecordAdapter(viewModel::onTypeClick) 54 63 } 55 - private val extra: ChangeRecordExtra by lazy { 56 - arguments?.getParcelable<ChangeRecordExtra>(ARGS_EXTRA) ?: ChangeRecordExtra.New() 64 + private val extra: ChangeRecordParams by lazy { 65 + arguments?.getParcelable<ChangeRecordParams>(ARGS_PARAMS) ?: ChangeRecordParams.New() 57 66 } 58 67 59 68 override fun initDi() { ··· 63 72 } 64 73 65 74 override fun initUi() { 75 + setPreview() 76 + 66 77 if (BuildVersions.isLollipopOrHigher()) { 67 78 sharedElementEnterTransition = TransitionInflater.from(context) 68 79 .inflateTransition(android.R.transition.move) 69 80 } 70 81 71 82 val transitionName: String = when (extra) { 72 - is ChangeRecordExtra.Tracked -> (extra as? ChangeRecordExtra.Tracked)?.transitionName.orEmpty() 73 - is ChangeRecordExtra.Untracked -> (extra as? ChangeRecordExtra.Untracked)?.transitionName.orEmpty() 83 + is ChangeRecordParams.Tracked -> (extra as? ChangeRecordParams.Tracked)?.transitionName.orEmpty() 84 + is ChangeRecordParams.Untracked -> (extra as? ChangeRecordParams.Untracked)?.transitionName.orEmpty() 74 85 else -> "" 75 86 } 76 87 ViewCompat.setTransitionName(previewChangeRecord, transitionName) ··· 112 123 } 113 124 } 114 125 with(removeRecordViewModel) { 115 - prepare((extra as? ChangeRecordExtra.Tracked)?.id.orZero()) 126 + prepare((extra as? ChangeRecordParams.Tracked)?.id.orZero()) 116 127 deleteButtonEnabled.observe(viewLifecycleOwner, btnChangeRecordDelete::setEnabled) 117 128 deleteIconVisibility.observe(viewLifecycleOwner, btnChangeRecordDelete::visible::set) 118 129 } ··· 125 136 private fun updateUi(item: ChangeRecordViewData) { 126 137 etChangeRecordComment.setText(item.comment) 127 138 etChangeRecordComment.setSelection(item.comment.length) 139 + } 140 + 141 + private fun setPreview() = when (extra) { 142 + is ChangeRecordParams.Tracked -> (extra as? ChangeRecordParams.Tracked)?.preview 143 + is ChangeRecordParams.Untracked -> (extra as? ChangeRecordParams.Untracked)?.preview 144 + else -> null 145 + }?.let { preview -> 146 + ChangeRecordViewData( 147 + name = preview.name, 148 + timeStarted = preview.timeStarted, 149 + timeFinished = preview.timeFinished, 150 + dateTimeStarted = "", 151 + dateTimeFinished = "", 152 + duration = preview.duration, 153 + iconId = preview.iconId, 154 + color = preview.color, 155 + comment = preview.comment 156 + ).let(::updatePreview) 128 157 } 129 158 130 159 private fun updatePreview(item: ChangeRecordViewData) { ··· 142 171 } 143 172 144 173 companion object { 145 - private const val ARGS_EXTRA = "args_extra" 174 + private const val ARGS_PARAMS = "args_change_record_params" 146 175 147 176 fun createBundle(data: Any?): Bundle = Bundle().apply { 148 177 when (data) { 149 - is ChangeRecordParams -> { 150 - val extra = when (data) { 151 - is ChangeRecordParams.Tracked -> { 152 - ChangeRecordExtra.Tracked( 153 - transitionName = data.transitionName, 154 - id = data.id 155 - ) 156 - } 157 - is ChangeRecordParams.Untracked -> { 158 - ChangeRecordExtra.Untracked( 159 - transitionName = data.transitionName, 160 - timeStarted = data.timeStarted, 161 - timeEnded = data.timeEnded 162 - ) 163 - } 164 - is ChangeRecordParams.New -> { 165 - ChangeRecordExtra.New(data.daysFromToday) 166 - } 167 - } 168 - putParcelable(ARGS_EXTRA, extra) 169 - } 178 + is ChangeRecordParams -> putParcelable(ARGS_PARAMS, data) 170 179 } 171 180 } 172 181 }
+10 -10
feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordViewModel.kt
··· 17 17 import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor 18 18 import com.example.util.simpletimetracker.domain.model.Record 19 19 import com.example.util.simpletimetracker.feature_change_record.R 20 - import com.example.util.simpletimetracker.feature_change_record.extra.ChangeRecordExtra 21 20 import com.example.util.simpletimetracker.feature_change_record.mapper.ChangeRecordViewDataMapper 22 21 import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordViewData 23 22 import com.example.util.simpletimetracker.navigation.Notification 24 23 import com.example.util.simpletimetracker.navigation.Router 25 24 import com.example.util.simpletimetracker.navigation.Screen 25 + import com.example.util.simpletimetracker.navigation.params.ChangeRecordParams 26 26 import com.example.util.simpletimetracker.navigation.params.DateTimeDialogParams 27 27 import com.example.util.simpletimetracker.navigation.params.ToastParams 28 28 import kotlinx.coroutines.launch ··· 39 39 private val prefsInteractor: PrefsInteractor 40 40 ) : ViewModel() { 41 41 42 - lateinit var extra: ChangeRecordExtra 42 + lateinit var extra: ChangeRecordParams 43 43 44 44 val record: LiveData<ChangeRecordViewData> by lazy { 45 45 return@lazy MutableLiveData<ChangeRecordViewData>().let { initial -> ··· 101 101 (saveButtonEnabled as MutableLiveData).value = false 102 102 viewModelScope.launch { 103 103 // Zero id creates new record 104 - val id = (extra as? ChangeRecordExtra.Tracked)?.id.orZero() 104 + val id = (extra as? ChangeRecordParams.Tracked)?.id.orZero() 105 105 Record( 106 106 id = id, 107 107 typeId = newTypeId, ··· 164 164 165 165 private suspend fun initializePreviewViewData() { 166 166 when (extra) { 167 - is ChangeRecordExtra.Tracked -> { 168 - recordInteractor.get((extra as ChangeRecordExtra.Tracked).id)?.let { record -> 167 + is ChangeRecordParams.Tracked -> { 168 + recordInteractor.get((extra as ChangeRecordParams.Tracked).id)?.let { record -> 169 169 newTypeId = record.typeId.orZero() 170 170 newTimeStarted = record.timeStarted 171 171 newTimeEnded = record.timeEnded 172 172 newComment = record.comment 173 173 } 174 174 } 175 - is ChangeRecordExtra.Untracked -> { 176 - newTimeStarted = (extra as ChangeRecordExtra.Untracked).timeStarted 177 - newTimeEnded = (extra as ChangeRecordExtra.Untracked).timeEnded 175 + is ChangeRecordParams.Untracked -> { 176 + newTimeStarted = (extra as ChangeRecordParams.Untracked).timeStarted 177 + newTimeEnded = (extra as ChangeRecordParams.Untracked).timeEnded 178 178 } 179 - is ChangeRecordExtra.New -> { 180 - newTimeEnded = getInitialDate((extra as ChangeRecordExtra.New).daysFromToday) 179 + is ChangeRecordParams.New -> { 180 + newTimeEnded = getInitialDate((extra as ChangeRecordParams.New).daysFromToday) 181 181 newTimeStarted = newTimeEnded - ONE_HOUR 182 182 } 183 183 }
+14 -2
feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/viewModel/RecordsViewModel.kt
··· 30 30 } 31 31 32 32 fun onRecordClick(item: RecordViewData, sharedElements: Map<Any, String>) { 33 + val preview = ChangeRecordParams.Preview( 34 + name = item.name, 35 + timeStarted = item.timeStarted, 36 + timeFinished = item.timeFinished, 37 + duration = item.duration, 38 + iconId = item.iconId, 39 + color = item.color, 40 + comment = item.comment 41 + ) 42 + 33 43 val params = when (item) { 34 44 is RecordViewData.Tracked -> ChangeRecordParams.Tracked( 35 45 transitionName = TransitionNames.RECORD + item.id, 36 - id = item.id 46 + id = item.id, 47 + preview = preview 37 48 ) 38 49 is RecordViewData.Untracked -> ChangeRecordParams.Untracked( 39 50 transitionName = TransitionNames.RECORD + item.getUniqueId(), 40 51 timeStarted = item.timeStartedTimestamp, 41 - timeEnded = item.timeEndedTimestamp 52 + timeEnded = item.timeEndedTimestamp, 53 + preview = preview 42 54 ) 43 55 } 44 56 router.navigate(
+10 -1
feature_records_all/src/main/java/com/example/util/simpletimetracker/feature_records_all/viewModel/RecordsAllViewModel.kt
··· 47 47 if (item is RecordViewData.Tracked) { 48 48 ChangeRecordParams.Tracked( 49 49 transitionName = TransitionNames.RECORD + item.id, 50 - id = item.id 50 + id = item.id, 51 + preview = ChangeRecordParams.Preview( 52 + name = item.name, 53 + timeStarted = item.timeStarted, 54 + timeFinished = item.timeFinished, 55 + duration = item.duration, 56 + iconId = item.iconId, 57 + color = item.color, 58 + comment = item.comment 59 + ) 51 60 ).let { params -> 52 61 router.navigate( 53 62 screen = Screen.CHANGE_RECORD_FROM_RECORDS_ALL,
+25 -4
navigation/src/main/java/com/example/util/simpletimetracker/navigation/params/ChangeRecordParams.kt
··· 1 1 package com.example.util.simpletimetracker.navigation.params 2 2 3 - sealed class ChangeRecordParams { 3 + import android.os.Parcelable 4 + import androidx.annotation.ColorInt 5 + import androidx.annotation.DrawableRes 6 + import kotlinx.android.parcel.Parcelize 4 7 8 + sealed class ChangeRecordParams: Parcelable { 9 + 10 + @Parcelize 5 11 data class Tracked( 6 12 val transitionName: String, 7 - val id: Long 13 + val id: Long, 14 + val preview: Preview 8 15 ) : ChangeRecordParams() 9 16 17 + @Parcelize 10 18 data class Untracked( 11 19 val transitionName: String, 12 20 val timeStarted: Long, 13 - val timeEnded: Long 21 + val timeEnded: Long, 22 + val preview: Preview 14 23 ) : ChangeRecordParams() 15 24 25 + @Parcelize 16 26 data class New( 17 - val daysFromToday: Int 27 + val daysFromToday: Int = 0 18 28 ) : ChangeRecordParams() 29 + 30 + @Parcelize 31 + data class Preview( 32 + val name: String, 33 + val timeStarted: String, 34 + val timeFinished: String, 35 + val duration: String, 36 + @DrawableRes val iconId: Int, 37 + @ColorInt val color: Int, 38 + val comment: String 39 + ): Parcelable 19 40 }