Skip to content

Commit f80489c

Browse files
committed
add shared transition to total tracked in statistics
1 parent 7ca6354 commit f80489c

10 files changed

Lines changed: 86 additions & 96 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -1,22 +1,33 @@
11
package com.example.util.simpletimetracker.feature_statistics.adapter
22

3+
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
34
import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate
4-
import com.example.util.simpletimetracker.feature_views.extension.setOnClick
5-
import com.example.util.simpletimetracker.feature_statistics.databinding.ItemStatisticsInfoLayoutBinding as Binding
6-
import com.example.util.simpletimetracker.feature_statistics.viewData.StatisticsInfoViewData as ViewData
5+
import com.example.util.simpletimetracker.feature_base_adapter.statistics.StatisticsViewData
6+
import com.example.util.simpletimetracker.feature_base_adapter.statistics.bind
7+
import com.example.util.simpletimetracker.feature_base_adapter.databinding.ItemStatisticsLayoutBinding as Binding
8+
import com.example.util.simpletimetracker.feature_statistics.adapter.StatisticsInfoViewData as ViewData
79

810
fun createStatisticsInfoAdapterDelegate(
9-
onClick: () -> Unit,
11+
onItemClick: ((StatisticsViewData, Map<Any, String>) -> Unit)?,
1012
) = createRecyclerBindingAdapterDelegate<ViewData, Binding>(
1113
Binding::inflate,
1214
) { binding, item, _ ->
1315

1416
with(binding) {
1517
item as ViewData
1618

17-
tvStatisticsInfoName.text = item.name
18-
tvStatisticsInfoText.text = item.text
19-
20-
root.setOnClick(onClick)
19+
viewStatisticsItem.bind(
20+
item = item.data,
21+
onItemClick = onItemClick,
22+
)
2123
}
24+
}
25+
26+
data class StatisticsInfoViewData(
27+
val data: StatisticsViewData,
28+
) : ViewHolderType {
29+
30+
override fun getUniqueId(): Long = data.name.hashCode().toLong()
31+
32+
override fun isValidType(other: ViewHolderType): Boolean = other is ViewData
2233
}

features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/interactor/StatisticsDetailTotalNavigator.kt

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.example.util.simpletimetracker.core.interactor.GetStatisticsDetailRan
55
import com.example.util.simpletimetracker.core.interactor.GetTotalStatisticsFilterInteractor
66
import com.example.util.simpletimetracker.domain.prefs.interactor.PrefsInteractor
77
import com.example.util.simpletimetracker.domain.record.model.RecordsFilter
8+
import com.example.util.simpletimetracker.feature_base_adapter.statistics.StatisticsViewData
89
import com.example.util.simpletimetracker.navigation.Router
910
import com.example.util.simpletimetracker.navigation.params.screen.StatisticsDetailParams
1011
import javax.inject.Inject
@@ -18,19 +19,26 @@ class StatisticsDetailTotalNavigator @Inject constructor(
1819

1920
suspend fun execute(
2021
shift: Int,
22+
item: StatisticsViewData,
23+
sharedElements: Map<Any, String>,
2124
) {
2225
val filter = getTotalStatisticsFilterInteractor.execute(
2326
filterType = prefsInteractor.getChartFilterType(),
2427
)
2528

26-
val params = StatisticsDetailParams(
27-
transitionName = "",
28-
filter = filter.let(::listOf).map(RecordsFilter::toParams),
29-
range = getStatisticsDetailRangeInteractor.execute(),
30-
shift = shift,
31-
preview = null,
29+
router.navigate(
30+
data = StatisticsDetailParams(
31+
transitionName = item.transitionName.orEmpty(),
32+
filter = filter.let(::listOf).map(RecordsFilter::toParams),
33+
range = getStatisticsDetailRangeInteractor.execute(),
34+
shift = shift,
35+
preview = StatisticsDetailParams.Preview(
36+
name = item.name,
37+
iconId = item.icon?.toParams(),
38+
color = item.color,
39+
),
40+
),
41+
sharedElements = sharedElements,
3242
)
33-
34-
router.navigate(params)
3543
}
3644
}

features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/interactor/StatisticsViewDataInteractor.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,13 @@ class StatisticsViewDataInteractor @Inject constructor(
145145
filteredIds = filteredIds,
146146
durationFormat = durationFormat,
147147
showSeconds = showSeconds,
148-
).let(statisticsViewDataMapper::mapStatisticsTotalTracked)
148+
).let {
149+
statisticsViewDataMapper.mapStatisticsTotalTracked(
150+
shift = shift,
151+
totalTracked = it,
152+
isDarkTheme = isDarkTheme,
153+
)
154+
}
149155
val showFirstEnterHint = when {
150156
// Show hint ony on current date.
151157
shift != 0 -> false

features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/mapper/StatisticsViewDataMapper.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
66
import com.example.util.simpletimetracker.feature_base_adapter.empty.EmptyViewData
77
import com.example.util.simpletimetracker.feature_base_adapter.hint.HintViewData
88
import com.example.util.simpletimetracker.feature_base_adapter.hintBig.HintBigViewData
9+
import com.example.util.simpletimetracker.feature_base_adapter.statistics.StatisticsViewData
910
import com.example.util.simpletimetracker.feature_statistics.R
10-
import com.example.util.simpletimetracker.feature_statistics.viewData.StatisticsInfoViewData
11+
import com.example.util.simpletimetracker.feature_statistics.adapter.StatisticsInfoViewData
12+
import com.example.util.simpletimetracker.feature_views.TransitionNames
1113
import com.example.util.simpletimetracker.feature_views.extension.setForegroundSpan
1214
import com.example.util.simpletimetracker.feature_views.extension.toSpannableString
1315
import javax.inject.Inject
@@ -16,11 +18,23 @@ class StatisticsViewDataMapper @Inject constructor(
1618
private val resourceRepo: ResourceRepo,
1719
) {
1820

19-
fun mapStatisticsTotalTracked(totalTracked: String): ViewHolderType {
20-
return StatisticsInfoViewData(
21+
fun mapStatisticsTotalTracked(
22+
shift: Int,
23+
totalTracked: String,
24+
isDarkTheme: Boolean,
25+
): ViewHolderType {
26+
val id = "statistics_total_tracked".hashCode().toLong()
27+
val transitionName = "${TransitionNames.STATISTICS_DETAIL}_shift${shift}_id${id}"
28+
val data = StatisticsViewData(
29+
id = id,
2130
name = resourceRepo.getString(R.string.statistics_total_tracked),
22-
text = totalTracked,
31+
duration = totalTracked,
32+
percent = "",
33+
color = resourceRepo.getThemedAttr(R.attr.appCardBackgroundColor, isDarkTheme),
34+
icon = null,
35+
transitionName = transitionName,
2336
)
37+
return StatisticsInfoViewData(data)
2438
}
2539

2640
fun mapToEmpty(): ViewHolderType {

features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/view/StatisticsFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ class StatisticsFragment :
146146
onChartAttached = viewModel::onChartAttached,
147147
),
148148
createStatisticsInfoAdapterDelegate(
149-
onClick = viewModel::onTotalClicked,
149+
onItemClick = throttle(viewModel::onTotalClicked),
150150
),
151151
createStatisticsAdapterDelegate(
152152
onItemClick = throttle(viewModel::onItemClick),

features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/viewData/StatisticsInfoViewData.kt

Lines changed: 0 additions & 13 deletions
This file was deleted.

features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/viewModel/StatisticsViewModel.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,9 +113,14 @@ class StatisticsViewModel @Inject constructor(
113113
)
114114
}
115115

116-
fun onTotalClicked() = viewModelScope.launch {
116+
fun onTotalClicked(
117+
item: StatisticsViewData,
118+
sharedElements: Map<Any, String>,
119+
) = viewModelScope.launch {
117120
statisticsDetailTotalNavigator.execute(
118121
shift = getShift(),
122+
item = item,
123+
sharedElements = sharedElements,
119124
)
120125
}
121126

features/feature_statistics/src/main/res/layout/item_statistics_info_layout.xml

Lines changed: 0 additions & 51 deletions
This file was deleted.

features/feature_views/src/main/java/com/example/util/simpletimetracker/feature_views/StatisticsView.kt

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import com.example.util.simpletimetracker.feature_views.databinding.StatisticsVi
1010
import com.example.util.simpletimetracker.feature_views.extension.layoutInflater
1111
import com.example.util.simpletimetracker.feature_views.extension.visible
1212
import com.example.util.simpletimetracker.feature_views.viewData.RecordTypeIcon
13+
import androidx.core.content.withStyledAttributes
14+
import androidx.core.view.isGone
15+
import androidx.core.view.isInvisible
16+
import androidx.core.view.isVisible
1317

1418
class StatisticsView @JvmOverloads constructor(
1519
context: Context,
@@ -58,7 +62,7 @@ class StatisticsView @JvmOverloads constructor(
5862
set(value) {
5963
field = value
6064
binding.tvStatisticsItemPercent.text = value
61-
setDividerColor()
65+
setPercentVisibility()
6266
}
6367

6468
init {
@@ -80,8 +84,8 @@ class StatisticsView @JvmOverloads constructor(
8084
attrs: AttributeSet?,
8185
defStyleAttr: Int,
8286
) {
83-
context.obtainStyledAttributes(attrs, R.styleable.StatisticsView, defStyleAttr, 0)
84-
.run {
87+
context
88+
.withStyledAttributes(attrs, R.styleable.StatisticsView, defStyleAttr, 0) {
8589
if (hasValue(R.styleable.StatisticsView_itemName)) {
8690
itemName = getString(R.styleable.StatisticsView_itemName).orEmpty()
8791
}
@@ -111,16 +115,21 @@ class StatisticsView @JvmOverloads constructor(
111115
if (hasValue(R.styleable.StatisticsView_itemPercent)) {
112116
itemPercent = getString(R.styleable.StatisticsView_itemPercent).orEmpty()
113117
}
114-
115-
recycle()
116118
}
117119
}
118120

119121
private fun setDividerColor() {
120-
if (itemPercent.isNotEmpty()) {
121-
normalizeLightness(itemColor)
122+
binding.dividerStatisticsPercent.setBackgroundColor(normalizeLightness(itemColor))
123+
}
124+
125+
private fun setPercentVisibility() {
126+
val isVisible = itemPercent.isNotEmpty()
127+
binding.tvStatisticsItemPercent.isVisible = isVisible
128+
binding.dividerStatisticsPercent.isVisible = isVisible
129+
if (isVisible) {
130+
binding.tvStatisticsItemPercentWidth.isInvisible = true
122131
} else {
123-
itemColor
124-
}.let(binding.dividerStatisticsPercent::setBackgroundColor)
132+
binding.tvStatisticsItemPercentWidth.isGone = true
133+
}
125134
}
126135
}

features/feature_views/src/main/res/layout/statistics_view_layout.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
app:layout_constraintBottom_toBottomOf="parent"
5353
app:layout_constraintEnd_toStartOf="@id/dividerStatisticsPercent"
5454
app:layout_constraintTop_toTopOf="parent"
55+
app:layout_goneMarginEnd="12dp"
5556
tools:text="5h 23m" />
5657

5758
<View

0 commit comments

Comments
 (0)