Skip to content

Commit 31d6786

Browse files
committed
change activity for divide action
1 parent 228b973 commit 31d6786

13 files changed

Lines changed: 190 additions & 16 deletions

File tree

app/src/androidTest/java/com/example/util/simpletimetracker/RecordActionsSplitTest.kt

Lines changed: 69 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.test.espresso.Espresso.onView
44
import androidx.test.espresso.Espresso.pressBack
55
import androidx.test.espresso.action.GeneralLocation
66
import androidx.test.espresso.matcher.ViewMatchers.hasDescendant
7+
import androidx.test.espresso.matcher.ViewMatchers.hasSibling
78
import androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed
89
import androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA
910
import androidx.test.espresso.matcher.ViewMatchers.withId
@@ -200,6 +201,70 @@ class RecordActionsSplitTest : BaseUiTest() {
200201
checkRecord(fullName, timeStartedPreview, timeEndedPreview, timeRangePreview, comment)
201202
}
202203

204+
@Test
205+
fun recordSplitChangeActivityBefore() {
206+
val firstName = "First"
207+
val secondName = "Second"
208+
val calendar = Calendar.getInstance()
209+
val comment = "Some_comment"
210+
val tag = "Tag"
211+
val fullName = "$firstName - $tag"
212+
213+
// Add data
214+
val timeStartedTimestamp = calendar.getMillis(hour = 15, minute = 0)
215+
val timeEndedTimestamp = calendar.getMillis(hour = 16, minute = 0)
216+
testUtils.addActivity(name = firstName, color = firstColor, icon = firstIcon)
217+
testUtils.addActivity(name = secondName, color = lastColor, icon = lastIcon)
218+
testUtils.addRecordTag(tag)
219+
testUtils.addRecord(
220+
typeName = firstName,
221+
timeStarted = timeStartedTimestamp,
222+
timeEnded = timeEndedTimestamp,
223+
tagNames = listOf(tag),
224+
comment = comment,
225+
)
226+
227+
// Open split action
228+
NavUtils.openRecordsScreen()
229+
clickOnView(allOf(withText(fullName), isCompletelyDisplayed()))
230+
onView(withText(coreR.string.change_record_actions_hint)).perform(nestedScrollTo())
231+
clickOnViewWithText(coreR.string.change_record_actions_hint)
232+
233+
// Change activity for the first split part
234+
clickOnAdjustment("+30")
235+
clickOnView(
236+
allOf(
237+
withId(R.id.btn_change_record_preview_before_action),
238+
hasSibling(hasDescendant(withText(firstName))),
239+
isCompletelyDisplayed()
240+
)
241+
)
242+
clickOnViewWithText(secondName)
243+
244+
// Split
245+
clickOnViewWithText(coreR.string.change_record_split)
246+
247+
// Check that two records created with different activities
248+
checkRecord(
249+
name = secondName,
250+
timeStartedPreview = timeStartedTimestamp.formatTime(),
251+
timeEndedPreview = (timeStartedTimestamp + TimeUnit.MINUTES.toMillis(30)).formatTime(),
252+
timeRangePreview = TimeUnit.MINUTES.toMillis(30).formatInterval(),
253+
comment = comment,
254+
color = lastColor,
255+
icon = lastIcon,
256+
)
257+
checkRecord(
258+
name = fullName,
259+
timeStartedPreview = (timeStartedTimestamp + TimeUnit.MINUTES.toMillis(30)).formatTime(),
260+
timeEndedPreview = timeEndedTimestamp.formatTime(),
261+
timeRangePreview = TimeUnit.MINUTES.toMillis(30).formatInterval(),
262+
comment = comment,
263+
color = firstColor,
264+
icon = firstIcon,
265+
)
266+
}
267+
203268
@Test
204269
fun recordUntrackedSplit() {
205270
val name = "Name"
@@ -361,13 +426,15 @@ class RecordActionsSplitTest : BaseUiTest() {
361426
timeEndedPreview: String,
362427
timeRangePreview: String,
363428
comment: String,
429+
color: Int? = null,
430+
icon: Int? = null,
364431
) {
365432
checkViewIsDisplayed(
366433
allOf(
367434
withId(baseR.id.viewRecordItem),
368-
withCardColor(firstColor),
435+
withCardColor(color ?: firstColor),
369436
hasDescendant(withText(name)),
370-
hasDescendant(withTag(firstIcon)),
437+
hasDescendant(withTag(icon ?: firstIcon)),
371438
hasDescendant(withText(timeStartedPreview)),
372439
hasDescendant(withText(timeEndedPreview)),
373440
hasDescendant(withText(timeRangePreview)),

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/adapter/ChangeRecordChangePreviewAdapterDelegate.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@ import androidx.core.view.isInvisible
44
import androidx.core.view.isVisible
55
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
66
import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate
7-
import com.example.util.simpletimetracker.feature_change_record.utils.setData
87
import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordSimpleViewData
9-
import com.example.util.simpletimetracker.feature_views.extension.setMargins
8+
import com.example.util.simpletimetracker.feature_change_record.utils.setData
109
import com.example.util.simpletimetracker.feature_views.extension.setOnClick
10+
import com.example.util.simpletimetracker.feature_views.extension.setMargins
1111
import com.example.util.simpletimetracker.feature_change_record.adapter.ChangeRecordChangePreviewViewData as ViewData
1212
import com.example.util.simpletimetracker.feature_change_record.databinding.ChangeRecordPreviewItemBinding as Binding
1313

1414
fun createChangeRecordChangePreviewAdapterDelegate(
1515
onCheckboxClicked: (ViewData) -> Unit,
16+
onBeforeActionClicked: () -> Unit,
1617
) = createRecyclerBindingAdapterDelegate<ViewData, Binding>(
1718
Binding::inflate,
1819
) { binding, item, _ ->
@@ -23,6 +24,7 @@ fun createChangeRecordChangePreviewAdapterDelegate(
2324
root.setMargins(top = item.marginTopDp)
2425
ivChangeRecordPreviewCompare.isInvisible = !item.isCompareVisible
2526
checkChangeRecordPreviewItem.isVisible = item.isCheckVisible
27+
btnChangeRecordPreviewBeforeAction.isVisible = item.isBeforeActionVisible
2628
viewChangeRecordPreviewBefore.setData(item.before)
2729
viewChangeRecordPreviewAfter.setData(item.after)
2830
viewChangeRecordPreviewRemoved.isVisible = item.isRemoveVisible
@@ -33,6 +35,7 @@ fun createChangeRecordChangePreviewAdapterDelegate(
3335
}
3436

3537
checkChangeRecordPreviewItem.setOnClick { onCheckboxClicked(item) }
38+
btnChangeRecordPreviewBeforeAction.setOnClick { onBeforeActionClicked() }
3639
}
3740
}
3841

@@ -45,6 +48,7 @@ data class ChangeRecordChangePreviewViewData(
4548
val isRemoveVisible: Boolean,
4649
val isCheckVisible: Boolean,
4750
val isCompareVisible: Boolean,
51+
val isBeforeActionVisible: Boolean,
4852
) : ViewHolderType {
4953

5054
override fun getUniqueId(): Long = id

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/view/ChangeRecordCore.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ class ChangeRecordCore(
9292
createDividerAdapterDelegate(),
9393
createHintAdapterDelegate(),
9494
createHintAccentAdapterDelegate(),
95-
createChangeRecordChangePreviewAdapterDelegate(viewModel::onChangePreviewCheckClick),
95+
createChangeRecordChangePreviewAdapterDelegate(
96+
onCheckboxClicked = viewModel::onChangePreviewCheckClick,
97+
onBeforeActionClicked = viewModel::onChangePreviewBeforeActionClick,
98+
),
9699
createChangeRecordTimePreviewAdapterDelegate(viewModel::onItemTimePreviewClick),
97100
createChangeRecordTimeDoublePreviewAdapterDelegate(
98101
onTimeStartedClick = viewModel::onItemTimeStartedClick,

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/view/ChangeRecordFragment.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import com.example.util.simpletimetracker.core.di.BaseViewModelFactory
1111
import com.example.util.simpletimetracker.core.dialog.DateTimeDialogListener
1212
import com.example.util.simpletimetracker.core.dialog.DurationDialogListener
1313
import com.example.util.simpletimetracker.core.dialog.OnTagValueSelectedListener
14+
import com.example.util.simpletimetracker.core.dialog.TypesSelectionDialogListener
1415
import com.example.util.simpletimetracker.core.extension.setSharedTransitions
1516
import com.example.util.simpletimetracker.core.extension.toViewData
1617
import com.example.util.simpletimetracker.core.sharedViewModel.RemoveRecordViewModel
1718
import com.example.util.simpletimetracker.core.utils.InsetConfiguration
1819
import com.example.util.simpletimetracker.core.utils.fragmentArgumentDelegate
20+
import com.example.util.simpletimetracker.domain.record.model.RecordBase
1921
import com.example.util.simpletimetracker.feature_base_adapter.record.RecordViewData
2022
import com.example.util.simpletimetracker.feature_change_record.viewData.ChangeRecordViewData
2123
import com.example.util.simpletimetracker.feature_change_record.viewModel.ChangeRecordViewModel
@@ -33,6 +35,7 @@ class ChangeRecordFragment :
3335
BaseFragment<Binding>(),
3436
DateTimeDialogListener,
3537
DurationDialogListener,
38+
TypesSelectionDialogListener,
3639
OnTagValueSelectedListener {
3740

3841
override val inflater: (LayoutInflater, ViewGroup?, Boolean) -> Binding =
@@ -123,6 +126,15 @@ class ChangeRecordFragment :
123126
viewModel.onCategoryValueSelected(params, data)
124127
}
125128

129+
override fun onDataSelected(
130+
tag: String?,
131+
dataIds: List<Long>,
132+
tagValues: List<RecordBase.Tag>,
133+
selectValueOnStartTagIds: List<Long>,
134+
) {
135+
viewModel.onDataSelected(tag, dataIds)
136+
}
137+
126138
private fun setPreview() = when (extra) {
127139
is ChangeRecordParams.Tracked -> (extra as? ChangeRecordParams.Tracked)?.preview
128140
is ChangeRecordParams.Untracked -> (extra as? ChangeRecordParams.Untracked)?.preview

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordBaseViewModel.kt

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.example.util.simpletimetracker.core.extension.toParams
1111
import com.example.util.simpletimetracker.core.interactor.RecordTagViewDataInteractor
1212
import com.example.util.simpletimetracker.core.interactor.RecordTypesViewDataInteractor
1313
import com.example.util.simpletimetracker.core.interactor.SnackBarMessageNavigationInteractor
14+
import com.example.util.simpletimetracker.core.repo.ResourceRepo
1415
import com.example.util.simpletimetracker.core.view.timeAdjustment.TimeAdjustmentView
1516
import com.example.util.simpletimetracker.domain.extension.addOrRemove
1617
import com.example.util.simpletimetracker.domain.extension.dropSeconds
@@ -50,12 +51,14 @@ import com.example.util.simpletimetracker.navigation.params.screen.DateTimeDialo
5051
import com.example.util.simpletimetracker.navigation.params.screen.DateTimeDialogType
5152
import com.example.util.simpletimetracker.navigation.params.screen.DurationDialogParams
5253
import com.example.util.simpletimetracker.navigation.params.screen.RecordTagValueSelectionParams
54+
import com.example.util.simpletimetracker.navigation.params.screen.TypesSelectionDialogParams
5355
import kotlinx.coroutines.delay
5456
import kotlinx.coroutines.launch
5557
import java.util.concurrent.TimeUnit
5658

5759
abstract class ChangeRecordBaseViewModel(
5860
private val router: Router,
61+
private val resourceRepo: ResourceRepo,
5962
private val snackBarMessageNavigationInteractor: SnackBarMessageNavigationInteractor,
6063
private val prefsInteractor: PrefsInteractor,
6164
private val recordTypesViewDataInteractor: RecordTypesViewDataInteractor,
@@ -108,10 +111,11 @@ abstract class ChangeRecordBaseViewModel(
108111
protected var newTimeEnded: Long = 0
109112
protected var newTimeStarted: Long = 0
110113
protected var newTimeSplit: Long = 0
114+
protected var newSplitBeforeTypeId: Long? = null
111115
protected var newTags: List<RecordBase.Tag> = emptyList()
112116
protected var originalRecordId: Long = 0
113117
protected var originalTypeId: Long = 0
114-
protected var originalTagIds: List<Long> = emptyList()
118+
protected var originalTags: List<RecordBase.Tag> = emptyList()
115119
protected var originalTimeStarted: Long = 0
116120
protected var originalTimeEnded: Long = 0
117121
protected var dateTimeState = ChangeRecordDateTimeFieldsState(
@@ -268,6 +272,22 @@ abstract class ChangeRecordBaseViewModel(
268272
changeRecordActionsDelegate.onChangePreviewCheckClick(item)
269273
}
270274

275+
fun onChangePreviewBeforeActionClick() {
276+
TypesSelectionDialogParams(
277+
tag = SPLIT_BEFORE_TYPE_SELECTION,
278+
title = resourceRepo.getString(R.string.change_record_message_choose_type),
279+
subtitle = "",
280+
type = TypesSelectionDialogParams.Type.Activity,
281+
selectedTypeIds = emptyList(),
282+
selectedTagValues = emptyList(),
283+
selectedTagValueOnStart = emptyList(),
284+
isMultiSelectAvailable = false,
285+
idsShouldBeVisible = emptyList(),
286+
showHints = false,
287+
allowTagValueSelection = false,
288+
).let(router::navigate)
289+
}
290+
271291
fun onSaveClick() {
272292
onRecordChangeButtonClick(
273293
onProceed = ::onSaveClickDelegate,
@@ -339,6 +359,15 @@ abstract class ChangeRecordBaseViewModel(
339359
}
340360
}
341361

362+
fun onDataSelected(
363+
tag: String?,
364+
dataIds: List<Long>,
365+
) {
366+
if (tag != SPLIT_BEFORE_TYPE_SELECTION) return
367+
newSplitBeforeTypeId = dataIds.firstOrNull()
368+
updateActionsData()
369+
}
370+
342371
fun onCategoryLongClick(item: CategoryViewData, sharedElements: Pair<Any, String>) {
343372
val icon = (item as? CategoryViewData.Record)?.icon?.toParams()
344373

@@ -810,8 +839,11 @@ abstract class ChangeRecordBaseViewModel(
810839
),
811840
splitParams = ViewDataParams.SplitParams(
812841
newTimeSplit = newTimeSplit,
842+
newBeforeTypeId = newSplitBeforeTypeId,
813843
splitPreviewTimeEnded = previewTimeEnded,
814844
showTimeEndedOnSplitPreview = showTimeEndedOnSplitPreview,
845+
originalTypeId = originalTypeId,
846+
originalTags = originalTags,
815847
),
816848
duplicateParams = ViewDataParams.DuplicateParams(
817849
isAvailable = isDuplicateActionAvailable,
@@ -913,5 +945,6 @@ abstract class ChangeRecordBaseViewModel(
913945
private const val TIME_ENDED_TAG = "time_ended_tag"
914946
private const val TIME_SPLIT_TAG = "time_split_tag"
915947
private const val CHANGE_RECORD_TAG_VALUE_SELECTION = "CHANGE_RECORD_TAG_VALUE_SELECTION"
948+
private const val SPLIT_BEFORE_TYPE_SELECTION = "SPLIT_BEFORE_TYPE_SELECTION"
916949
}
917950
}

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/ChangeRecordViewModel.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.example.util.simpletimetracker.core.interactor.RecordTypesViewDataInt
1111
import com.example.util.simpletimetracker.core.interactor.SnackBarMessageNavigationInteractor
1212
import com.example.util.simpletimetracker.core.interactor.StatisticsDetailNavigationInteractor
1313
import com.example.util.simpletimetracker.core.mapper.TimeMapper
14+
import com.example.util.simpletimetracker.core.repo.ResourceRepo
1415
import com.example.util.simpletimetracker.domain.base.UNTRACKED_ITEM_ID
1516
import com.example.util.simpletimetracker.domain.extension.orZero
1617
import com.example.util.simpletimetracker.domain.record.interactor.AddRecordMediator
@@ -40,6 +41,7 @@ import javax.inject.Inject
4041

4142
@HiltViewModel
4243
class ChangeRecordViewModel @Inject constructor(
44+
resourceRepo: ResourceRepo,
4345
recordTypesViewDataInteractor: RecordTypesViewDataInteractor,
4446
recordTagViewDataInteractor: RecordTagViewDataInteractor,
4547
snackBarMessageNavigationInteractor: SnackBarMessageNavigationInteractor,
@@ -59,6 +61,7 @@ class ChangeRecordViewModel @Inject constructor(
5961
private val commentSelectionViewModelDelegate: CommentSelectionViewModelDelegateImpl,
6062
) : ChangeRecordBaseViewModel(
6163
router = router,
64+
resourceRepo = resourceRepo,
6265
snackBarMessageNavigationInteractor = snackBarMessageNavigationInteractor,
6366
prefsInteractor = prefsInteractor,
6467
recordTypesViewDataInteractor = recordTypesViewDataInteractor,
@@ -160,7 +163,7 @@ class ChangeRecordViewModel @Inject constructor(
160163
externalViewsInteractor.onRecordChangeType(listOf(originalTypeId))
161164
}
162165
val newTagIds = newTags.map(RecordBase.Tag::tagId)
163-
val removedTagIds = originalTagIds.filter { it !in newTagIds }
166+
val removedTagIds = originalTags.map { it.tagId }.filter { it !in newTagIds }
164167
if (removedTagIds.isNotEmpty()) {
165168
externalViewsInteractor.onRecordChangeTags(removedTagIds)
166169
}
@@ -238,7 +241,7 @@ class ChangeRecordViewModel @Inject constructor(
238241
newTimeSplit = newTimeStarted
239242
originalRecordId = recordId.orZero()
240243
originalTypeId = newTypeId
241-
originalTagIds = newTags.map(RecordBase.Tag::tagId)
244+
originalTags = newTags.toList() // Creates a copy.
242245
originalTimeStarted = newTimeStarted
243246
originalTimeEnded = newTimeEnded
244247
super.initializePreviewViewData()

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/base/ChangeRecordDelegateBridge.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,11 @@ class ChangeRecordDelegateBridge(
6060

6161
data class SplitParams(
6262
val newTimeSplit: Long,
63+
val newBeforeTypeId: Long?,
6364
val splitPreviewTimeEnded: Long,
6465
val showTimeEndedOnSplitPreview: Boolean,
66+
val originalTypeId: Long,
67+
val originalTags: List<RecordBase.Tag>,
6568
)
6669

6770
data class DuplicateParams(

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/delegates/ChangeRecordActionsAdjustDelegate.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class ChangeRecordActionsAdjustDelegate @Inject constructor(
125125
isRemoveVisible = false,
126126
isCheckVisible = false,
127127
isCompareVisible = true,
128+
isBeforeActionVisible = false,
128129
)
129130
result += ChangeRecordTimeDoublePreviewViewData(
130131
block = ChangeRecordActionsBlock.AdjustTimePreview,
@@ -281,6 +282,7 @@ class ChangeRecordActionsAdjustDelegate @Inject constructor(
281282
isRemoveVisible = isRemoveVisible,
282283
isCheckVisible = true,
283284
isCompareVisible = true,
285+
isBeforeActionVisible = false,
284286
)
285287
}
286288

features/feature_change_record/src/main/java/com/example/util/simpletimetracker/feature_change_record/viewModel/delegates/ChangeRecordActionsMergeDelegate.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class ChangeRecordActionsMergeDelegate @Inject constructor(
6767
isRemoveVisible = false,
6868
isCheckVisible = false,
6969
isCompareVisible = true,
70+
isBeforeActionVisible = false,
7071
)
7172
result += changeRecordViewDataMapper.mapRecordActionButton(
7273
action = action,

0 commit comments

Comments
 (0)