Skip to content

Commit

Permalink
add tag sort by activity
Browse files Browse the repository at this point in the history
  • Loading branch information
Razeeman committed May 9, 2024
1 parent 5ec1f64 commit 4d51d79
Show file tree
Hide file tree
Showing 39 changed files with 227 additions and 99 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example.util.simpletimetracker.domain.interactor

import com.example.util.simpletimetracker.domain.model.CardOrder
import com.example.util.simpletimetracker.domain.model.CardTagOrder
import com.example.util.simpletimetracker.domain.model.ChartFilterType
import com.example.util.simpletimetracker.domain.model.DayOfWeek
import com.example.util.simpletimetracker.domain.model.DaysInCalendar
Expand Down Expand Up @@ -82,12 +83,12 @@ class PrefsInteractor @Inject constructor(
prefsRepo.categoryOrder = mapFromCardOrder(cardOrder)
}

suspend fun getTagOrder(): CardOrder = withContext(Dispatchers.IO) {
mapToCardOrder(prefsRepo.tagOrder)
suspend fun getTagOrder(): CardTagOrder = withContext(Dispatchers.IO) {
mapToCardTagOrder(prefsRepo.tagOrder)
}

suspend fun setTagOrder(cardOrder: CardOrder) = withContext(Dispatchers.IO) {
prefsRepo.tagOrder = mapFromCardOrder(cardOrder)
suspend fun setTagOrder(cardOrder: CardTagOrder) = withContext(Dispatchers.IO) {
prefsRepo.tagOrder = mapFromCardTagOrder(cardOrder)
}

suspend fun getStatisticsRange(): RangeLength = withContext(Dispatchers.IO) {
Expand Down Expand Up @@ -649,4 +650,23 @@ class PrefsInteractor @Inject constructor(
CardOrder.MANUAL -> 2
}
}

private fun mapToCardTagOrder(data: Int): CardTagOrder {
return when (data) {
0 -> CardTagOrder.NAME
1 -> CardTagOrder.COLOR
2 -> CardTagOrder.MANUAL
3 -> CardTagOrder.ACTIVITY
else -> CardTagOrder.NAME
}
}

private fun mapFromCardTagOrder(data: CardTagOrder): Int {
return when (data) {
CardTagOrder.NAME -> 0
CardTagOrder.COLOR -> 1
CardTagOrder.MANUAL -> 2
CardTagOrder.ACTIVITY -> 3
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.example.util.simpletimetracker.domain.interactor

import com.example.util.simpletimetracker.domain.model.CardOrder
import com.example.util.simpletimetracker.domain.extension.orZero
import com.example.util.simpletimetracker.domain.model.CardTagOrder
import com.example.util.simpletimetracker.domain.model.RecordTag
import com.example.util.simpletimetracker.domain.model.RecordType
import com.example.util.simpletimetracker.domain.repo.RecordTagRepo
Expand All @@ -25,16 +26,35 @@ class RecordTagInteractor @Inject constructor(
return repo.isEmpty()
}

suspend fun getAll(cardOrder: CardOrder? = null): List<RecordTag> {
val types = recordTypeInteractor.getAll().associateBy { it.id }
suspend fun getAll(cardOrder: CardTagOrder? = null): List<RecordTag> {
val tags = repo.getAll()
val types = recordTypeInteractor.getAll()
val typesMap = types.associateBy { it.id }

return sortCardsInteractor.sort(
cardOrder = cardOrder ?: prefsInteractor.getTagOrder(),
val getActivityOrderProvider: suspend () -> Map<Long, Long> = {
val typesToTags = recordTypeToTagRepo.getAll()
val tagsToAssignedTypes = typesToTags
.groupBy { it.tagId }
.mapValues { (_, typeToTag) ->
typeToTag
.map { it.recordTypeId }
.sortedBy { typeId -> types.indexOfFirst { it.id == typeId } }
}
tags.associate { tag ->
val mainTypeId = tagsToAssignedTypes[tag.id]?.firstOrNull().orZero()
val type = typesMap[mainTypeId]
tag.id to types.indexOf(type).toLong()
}
}

return sortCardsInteractor.sortTags(
cardTagOrder = cardOrder ?: prefsInteractor.getTagOrder(),
manualOrderProvider = { prefsInteractor.getTagOrderManual() },
data = repo.getAll().map {
activityOrderProvider = { getActivityOrderProvider() },
data = tags.map {
mapForSort(
data = it,
colorSource = types[it.iconColorSource],
colorSource = typesMap[it.iconColorSource],
)
},
).map { it.data }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import com.example.util.simpletimetracker.domain.extension.orZero
import com.example.util.simpletimetracker.domain.mapper.AppColorMapper
import com.example.util.simpletimetracker.domain.model.AppColor
import com.example.util.simpletimetracker.domain.model.CardOrder
import com.example.util.simpletimetracker.domain.model.CardTagOrder
import java.util.Locale
import javax.inject.Inject
import kotlin.math.roundToInt
Expand All @@ -28,6 +29,24 @@ class SortCardsInteractor @Inject constructor(
}
}

suspend fun <T> sortTags(
cardTagOrder: CardTagOrder,
manualOrderProvider: suspend () -> Map<Long, Long>,
activityOrderProvider: suspend () -> Map<Long, Long>,
data: List<DataHolder<T>>,
): List<DataHolder<T>> {
return data
.let(::sortByName)
.let {
when (cardTagOrder) {
CardTagOrder.COLOR -> sortByColor(it)
CardTagOrder.MANUAL -> sortByManualOrder(it, manualOrderProvider)
CardTagOrder.NAME -> it
CardTagOrder.ACTIVITY -> sortByManualOrder(it, activityOrderProvider)
}
}
}

private fun <T> sortByName(
data: List<DataHolder<T>>,
): List<DataHolder<T>> {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.util.simpletimetracker.domain.model

enum class CardTagOrder {
NAME,
COLOR,
MANUAL,
ACTIVITY,
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.example.util.simpletimetracker.feature_change_activity_filter.view

import android.content.res.ColorStateList
import com.example.util.simpletimetracker.feature_change_activity_filter.databinding.ChangeActivityFilterFragmentBinding as Binding
import android.os.Bundle
import android.view.LayoutInflater
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.example.util.simpletimetracker.feature_change_category.view

import android.content.res.ColorStateList
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.example.util.simpletimetracker.feature_change_record.view

import android.content.res.ColorStateList
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.example.util.simpletimetracker.feature_change_record_tag.view

import android.content.res.ColorStateList
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -282,7 +282,7 @@
style="@style/EditScreenField"
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="@string/change_record_tag_type_hint"
android:text="@string/change_record_type_field"
app:layout_constraintEnd_toStartOf="@id/layoutChangeRecordTagTypesPreview"
app:layout_constraintStart_toStartOf="parent" />

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.example.util.simpletimetracker.feature_change_record_type.view

import android.content.res.ColorStateList
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.example.util.simpletimetracker.feature_change_running_record.view

import android.content.res.ColorStateList
import android.os.Bundle
import android.view.LayoutInflater
import android.view.ViewGroup
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor
import com.example.util.simpletimetracker.domain.interactor.RecordTagInteractor
import com.example.util.simpletimetracker.domain.interactor.RecordTypeInteractor
import com.example.util.simpletimetracker.domain.model.CardOrder
import com.example.util.simpletimetracker.domain.model.CardTagOrder
import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType
import com.example.util.simpletimetracker.feature_base_adapter.category.CategoryViewData
import com.example.util.simpletimetracker.feature_base_adapter.loader.LoaderViewData
Expand Down Expand Up @@ -70,7 +71,7 @@ class CardOrderViewModel @Inject constructor(
}
is CardOrderDialogParams.Type.Tag -> {
{
prefsInteractor.setTagOrder(CardOrder.MANUAL)
prefsInteractor.setTagOrder(CardTagOrder.MANUAL)
prefsInteractor.setTagOrderManual(it)
}
}
Expand All @@ -84,18 +85,20 @@ class CardOrderViewModel @Inject constructor(
}

private suspend fun loadViewData(): List<ViewHolderType> {
return when (extra.type) {
is CardOrderDialogParams.Type.RecordType -> loadTypesViewData()
is CardOrderDialogParams.Type.Category -> loadCategoriesViewData()
is CardOrderDialogParams.Type.Tag -> loadTagsViewData()
return when (val type = extra.type) {
is CardOrderDialogParams.Type.RecordType -> loadTypesViewData(type.order)
is CardOrderDialogParams.Type.Category -> loadCategoriesViewData(type.order)
is CardOrderDialogParams.Type.Tag -> loadTagsViewData(type.order)
}
}

private suspend fun loadTypesViewData(): List<ViewHolderType> {
private suspend fun loadTypesViewData(
initialOrder: CardOrder,
): List<ViewHolderType> {
val numberOfCards: Int = prefsInteractor.getNumberOfCards()
val isDarkTheme = prefsInteractor.getDarkMode()

return recordTypeInteractor.getAll(extra.initialOrder)
return recordTypeInteractor.getAll(initialOrder)
.filter { !it.hidden }
.takeUnless { it.isEmpty() }
?.map { type ->
Expand All @@ -109,10 +112,12 @@ class CardOrderViewModel @Inject constructor(
?: recordTypeViewDataMapper.mapToEmpty()
}

private suspend fun loadCategoriesViewData(): List<ViewHolderType> {
private suspend fun loadCategoriesViewData(
initialOrder: CardOrder,
): List<ViewHolderType> {
val isDarkTheme = prefsInteractor.getDarkMode()

return categoryInteractor.getAll(extra.initialOrder)
return categoryInteractor.getAll(initialOrder)
.takeUnless { it.isEmpty() }
?.map { category ->
categoryViewDataMapper.mapCategory(
Expand All @@ -123,11 +128,13 @@ class CardOrderViewModel @Inject constructor(
?: listOf(categoryViewDataMapper.mapToCategoriesEmpty())
}

private suspend fun loadTagsViewData(): List<ViewHolderType> {
private suspend fun loadTagsViewData(
initialOrder: CardTagOrder,
): List<ViewHolderType> {
val isDarkTheme = prefsInteractor.getDarkMode()
val types = recordTypeInteractor.getAll().associateBy { it.id }

return recordTagInteractor.getAll(extra.initialOrder)
return recordTagInteractor.getAll(initialOrder)
.filter { !it.archived }
.takeUnless { it.isEmpty() }
?.map { tag ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,15 @@ class SettingsDisplayViewDataInteractor @Inject constructor(
subtitle = "",
isChecked = prefsInteractor.getShowSeconds(),
)
result += mapOrderData(CardOrderDialogParams.Type.RecordType)
result += mapOrderData(CardOrderDialogParams.Type.Category)
result += mapOrderData(CardOrderDialogParams.Type.Tag)
result += mapOrderData(
CardOrderDialogParams.Type.RecordType(prefsInteractor.getCardOrder()),
)
result += mapOrderData(
CardOrderDialogParams.Type.Category(prefsInteractor.getCategoryOrder()),
)
result += mapOrderData(
CardOrderDialogParams.Type.Tag(prefsInteractor.getTagOrder()),
)
result += SettingsTextViewData(
block = SettingsBlock.DisplayCardSize,
title = resourceRepo.getString(R.string.settings_change_card_size),
Expand All @@ -190,14 +196,20 @@ class SettingsDisplayViewDataInteractor @Inject constructor(
return result
}

private suspend fun mapOrderData(
private fun mapOrderData(
type: CardOrderDialogParams.Type,
): SettingsSpinnerWithButtonViewData {
val cardOrderViewData = when (type) {
is CardOrderDialogParams.Type.RecordType -> prefsInteractor.getCardOrder()
is CardOrderDialogParams.Type.Category -> prefsInteractor.getCategoryOrder()
is CardOrderDialogParams.Type.Tag -> prefsInteractor.getTagOrder()
}.let(settingsMapper::toCardOrderViewData)
is CardOrderDialogParams.Type.RecordType -> {
type.order.let(settingsMapper::toCardOrderViewData)
}
is CardOrderDialogParams.Type.Category -> {
type.order.let(settingsMapper::toCardOrderViewData)
}
is CardOrderDialogParams.Type.Tag -> {
type.order.let(settingsMapper::toCardTagOrderViewData)
}
}

val block = when (type) {
is CardOrderDialogParams.Type.RecordType -> SettingsBlock.DisplaySortActivities
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import com.example.util.simpletimetracker.core.utils.EXTRA_RECORD_TAG_NAME
import com.example.util.simpletimetracker.domain.extension.orZero
import com.example.util.simpletimetracker.domain.interactor.DarkMode
import com.example.util.simpletimetracker.domain.model.CardOrder
import com.example.util.simpletimetracker.domain.model.CardTagOrder
import com.example.util.simpletimetracker.domain.model.DayOfWeek
import com.example.util.simpletimetracker.domain.model.DaysInCalendar
import com.example.util.simpletimetracker.domain.model.RepeatButtonType
Expand Down Expand Up @@ -53,6 +54,13 @@ class SettingsMapper @Inject constructor(
CardOrder.MANUAL,
)

private val cardTagOrderList: List<CardTagOrder> = listOf(
CardTagOrder.NAME,
CardTagOrder.COLOR,
CardTagOrder.ACTIVITY,
CardTagOrder.MANUAL,
)

private val daysInCalendarList: List<DaysInCalendar> = listOf(
DaysInCalendar.ONE,
DaysInCalendar.THREE,
Expand Down Expand Up @@ -129,10 +137,24 @@ class SettingsMapper @Inject constructor(
)
}

fun toCardTagOrderViewData(currentOrder: CardTagOrder): CardOrderViewData {
return CardOrderViewData(
items = cardTagOrderList
.map(::toCardTagOrderName)
.map(CustomSpinner::CustomSpinnerTextItem),
selectedPosition = toPosition(currentOrder),
isManualConfigButtonVisible = currentOrder == CardTagOrder.MANUAL,
)
}

fun toCardOrder(position: Int): CardOrder {
return cardOrderList.getOrElse(position) { cardOrderList.first() }
}

fun toCardTagOrder(position: Int): CardTagOrder {
return cardTagOrderList.getOrElse(position) { cardTagOrderList.first() }
}

fun toDaysInCalendarViewData(currentValue: DaysInCalendar): DaysInCalendarViewData {
return DaysInCalendarViewData(
items = daysInCalendarList
Expand Down Expand Up @@ -331,6 +353,10 @@ class SettingsMapper @Inject constructor(
return cardOrderList.indexOf(cardOrder).takeUnless { it == -1 }.orZero()
}

private fun toPosition(cardOrder: CardTagOrder): Int {
return cardTagOrderList.indexOf(cardOrder).takeUnless { it == -1 }.orZero()
}

private fun toCardOrderName(cardOrder: CardOrder): String {
return when (cardOrder) {
CardOrder.NAME -> R.string.settings_sort_by_name
Expand All @@ -339,6 +365,15 @@ class SettingsMapper @Inject constructor(
}.let(resourceRepo::getString)
}

private fun toCardTagOrderName(cardOrder: CardTagOrder): String {
return when (cardOrder) {
CardTagOrder.NAME -> R.string.settings_sort_by_name
CardTagOrder.COLOR -> R.string.settings_sort_by_color
CardTagOrder.MANUAL -> R.string.settings_sort_manually
CardTagOrder.ACTIVITY -> R.string.settings_sort_activity
}.let(resourceRepo::getString)
}

private fun toPosition(daysInCalendar: DaysInCalendar): Int {
return daysInCalendarList.indexOf(daysInCalendar).takeUnless { it == -1 }.orZero()
}
Expand Down
Loading

0 comments on commit 4d51d79

Please sign in to comment.