diff --git a/core/src/main/java/com/example/util/simpletimetracker/core/mapper/DayOfWeekViewDataMapper.kt b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/DayOfWeekViewDataMapper.kt new file mode 100644 index 00000000..3f671e78 --- /dev/null +++ b/core/src/main/java/com/example/util/simpletimetracker/core/mapper/DayOfWeekViewDataMapper.kt @@ -0,0 +1,34 @@ +package com.example.util.simpletimetracker.core.mapper + +import com.example.util.simpletimetracker.domain.model.DayOfWeek +import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType +import com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek.DayOfWeekViewData +import javax.inject.Inject + +class DayOfWeekViewDataMapper @Inject constructor( + private val timeMapper: TimeMapper, + private val colorMapper: ColorMapper, +) { + + fun mapViewData( + selectedDaysOfWeek: List, + isDarkTheme: Boolean, + width: DayOfWeekViewData.Width, + paddingHorizontalDp: Int, + ): List { + return DayOfWeek.values().map { + val selected = it in selectedDaysOfWeek + DayOfWeekViewData( + dayOfWeek = it, + text = timeMapper.toShortDayOfWeekName(it), + color = if (selected) { + colorMapper.toActiveColor(isDarkTheme) + } else { + colorMapper.toInactiveColor(isDarkTheme) + }, + width = width, + paddingHorizontalDp = paddingHorizontalDp, + ) + } + } +} \ No newline at end of file diff --git a/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/dayOfWeek/DayOfWeekAdapterDelegate.kt b/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/dayOfWeek/DayOfWeekAdapterDelegate.kt index 8d04eb57..95a523a4 100644 --- a/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/dayOfWeek/DayOfWeekAdapterDelegate.kt +++ b/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/dayOfWeek/DayOfWeekAdapterDelegate.kt @@ -1,21 +1,34 @@ package com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek +import android.view.ViewGroup +import androidx.core.view.updatePadding import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate +import com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek.DayOfWeekViewData.Width.MatchParent +import com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek.DayOfWeekViewData.Width.WrapContent +import com.example.util.simpletimetracker.feature_views.extension.dpToPx import com.example.util.simpletimetracker.feature_views.extension.setOnClickWith -import com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek.DayOfWeekViewData as ViewData import com.example.util.simpletimetracker.feature_base_adapter.databinding.ItemDayOfWeekBinding as Binding +import com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek.DayOfWeekViewData as ViewData fun createDayOfWeekAdapterDelegate( onClick: (ViewData) -> Unit, ) = createRecyclerBindingAdapterDelegate( - Binding::inflate + Binding::inflate, ) { binding, item, _ -> with(binding) { item as ViewData + containerDayOfWeekItem.layoutParams.width = when (item.width) { + is MatchParent -> ViewGroup.LayoutParams.MATCH_PARENT + is WrapContent -> ViewGroup.LayoutParams.WRAP_CONTENT + } containerDayOfWeekItem.setCardBackgroundColor(item.color) btnDayOfWeekItem.text = item.text btnDayOfWeekItem.setOnClickWith(item, onClick) + btnDayOfWeekItem.updatePadding( + left = item.paddingHorizontalDp.dpToPx(), + right = item.paddingHorizontalDp.dpToPx(), + ) } } diff --git a/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/dayOfWeek/DayOfWeekViewData.kt b/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/dayOfWeek/DayOfWeekViewData.kt index 26a19fe6..1333fda2 100644 --- a/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/dayOfWeek/DayOfWeekViewData.kt +++ b/features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/dayOfWeek/DayOfWeekViewData.kt @@ -8,10 +8,17 @@ data class DayOfWeekViewData( val dayOfWeek: DayOfWeek, val text: String, @ColorInt val color: Int, + val width: Width, + val paddingHorizontalDp: Int, ) : ViewHolderType { override fun getUniqueId(): Long = dayOfWeek.ordinal.toLong() override fun isValidType(other: ViewHolderType): Boolean = other is DayOfWeekViewData + + sealed interface Width { + object MatchParent : Width + object WrapContent : Width + } } \ No newline at end of file diff --git a/features/feature_base_adapter/src/main/res/layout/item_day_of_week.xml b/features/feature_base_adapter/src/main/res/layout/item_day_of_week.xml index 435b9684..5f6bfbf6 100644 --- a/features/feature_base_adapter/src/main/res/layout/item_day_of_week.xml +++ b/features/feature_base_adapter/src/main/res/layout/item_day_of_week.xml @@ -5,21 +5,22 @@ android:id="@+id/containerDayOfWeekItem" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_margin="2dp" app:cardCornerRadius="@dimen/button_corner_radius" - app:cardElevation="@dimen/record_type_card_elevation" - app:cardPreventCornerOverlap="false" - app:cardUseCompatPadding="true" + app:cardElevation="2dp" tools:cardBackgroundColor="?appInactiveColor"> \ No newline at end of file diff --git a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDataMapper.kt b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDataMapper.kt index e3238b98..bbc3a373 100644 --- a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDataMapper.kt +++ b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDataMapper.kt @@ -1,6 +1,6 @@ package com.example.util.simpletimetracker.feature_change_record_type.goals -import com.example.util.simpletimetracker.core.mapper.ColorMapper +import com.example.util.simpletimetracker.core.mapper.DayOfWeekViewDataMapper import com.example.util.simpletimetracker.core.mapper.TimeMapper import com.example.util.simpletimetracker.core.repo.ResourceRepo import com.example.util.simpletimetracker.domain.extension.orZero @@ -17,7 +17,7 @@ import javax.inject.Inject class GoalsViewDataMapper @Inject constructor( private val resourceRepo: ResourceRepo, private val timeMapper: TimeMapper, - private val colorMapper: ColorMapper, + private val dayOfWeekViewDataMapper: DayOfWeekViewDataMapper, ) { private val goalTypeList: List = listOf( @@ -128,17 +128,11 @@ class GoalsViewDataMapper @Inject constructor( ): List { if (goal.value == 0L) return emptyList() - return DayOfWeek.values().map { - val selected = it in selectedDaysOfWeek - DayOfWeekViewData( - dayOfWeek = it, - text = timeMapper.toShortDayOfWeekName(it), - color = if (selected) { - colorMapper.toActiveColor(isDarkTheme) - } else { - colorMapper.toInactiveColor(isDarkTheme) - }, - ) - } + return dayOfWeekViewDataMapper.mapViewData( + selectedDaysOfWeek = selectedDaysOfWeek, + isDarkTheme = isDarkTheme, + width = DayOfWeekViewData.Width.MatchParent, + paddingHorizontalDp = 2, + ) } } \ No newline at end of file diff --git a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDelegate.kt b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDelegate.kt index 14a6132c..b929975e 100644 --- a/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDelegate.kt +++ b/features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDelegate.kt @@ -71,7 +71,7 @@ object GoalsViewDelegate { layoutManager = FlexboxLayoutManager(context).apply { flexDirection = FlexDirection.ROW justifyContent = JustifyContent.CENTER - flexWrap = FlexWrap.WRAP + flexWrap = FlexWrap.NOWRAP } adapter = dayOfWeekAdapter } diff --git a/features/feature_change_record_type/src/main/res/layout/change_record_type_goal_layout.xml b/features/feature_change_record_type/src/main/res/layout/change_record_type_goal_layout.xml index bb13174d..eeb2f7b9 100644 --- a/features/feature_change_record_type/src/main/res/layout/change_record_type_goal_layout.xml +++ b/features/feature_change_record_type/src/main/res/layout/change_record_type_goal_layout.xml @@ -3,7 +3,8 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:clipChildren="false"> diff --git a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt index 3bbf4426..ed668ce2 100644 --- a/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt +++ b/features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt @@ -6,6 +6,7 @@ import com.example.util.simpletimetracker.core.interactor.RecordFilterInteractor import com.example.util.simpletimetracker.core.mapper.CategoryViewDataMapper import com.example.util.simpletimetracker.core.mapper.ColorMapper import com.example.util.simpletimetracker.core.mapper.DateDividerViewDataMapper +import com.example.util.simpletimetracker.core.mapper.DayOfWeekViewDataMapper import com.example.util.simpletimetracker.core.mapper.MultitaskRecordViewDataMapper import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper import com.example.util.simpletimetracker.core.mapper.RecordViewDataMapper @@ -34,7 +35,6 @@ import com.example.util.simpletimetracker.domain.extension.hasUntrackedFilter import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor import com.example.util.simpletimetracker.domain.interactor.RecordInteractor import com.example.util.simpletimetracker.domain.model.Category -import com.example.util.simpletimetracker.domain.model.DayOfWeek import com.example.util.simpletimetracker.domain.model.MultitaskRecord import com.example.util.simpletimetracker.domain.model.Range import com.example.util.simpletimetracker.domain.model.Record @@ -77,6 +77,7 @@ class RecordsFilterViewDataInteractor @Inject constructor( private val multitaskRecordViewDataMapper: MultitaskRecordViewDataMapper, private val getRunningRecordViewDataMediator: GetRunningRecordViewDataMediator, private val dateDividerViewDataMapper: DateDividerViewDataMapper, + private val dayOfWeekViewDataMapper: DayOfWeekViewDataMapper, private val colorMapper: ColorMapper, private val timeMapper: TimeMapper, private val resourceRepo: ResourceRepo, @@ -121,7 +122,7 @@ class RecordsFilterViewDataInteractor @Inject constructor( timestamp = timestamp, type = DateTimeDialogType.DATETIME(initialTab = DateTimeDialogType.Tab.DATE), useMilitaryTime = useMilitaryTime, - firstDayOfWeek = firstDayOfWeek + firstDayOfWeek = firstDayOfWeek, ) } @@ -256,7 +257,7 @@ class RecordsFilterViewDataInteractor @Inject constructor( RecordFilterViewData.Type.DURATION, RecordFilterViewData.Type.MANUALLY_FILTERED.takeIf { filters.hasManuallyFiltered() && !hasUntracked && !hasMultitask - } + }, ) return@withContext availableFilters.mapIndexed { index, type -> @@ -324,8 +325,8 @@ class RecordsFilterViewDataInteractor @Inject constructor( ?.plus( categoryViewDataMapper.mapToUncategorizedItem( isFiltered = !selectedCategoryItems.hasUncategorizedItem(), - isDarkTheme = isDarkTheme - ) + isDarkTheme = isDarkTheme, + ), ) .orEmpty() @@ -381,7 +382,7 @@ class RecordsFilterViewDataInteractor @Inject constructor( mapper.mapCommentFilter( type = it, filters = filters, - isDarkTheme = isDarkTheme + isDarkTheme = isDarkTheme, ).let(result::add) } @@ -393,7 +394,7 @@ class RecordsFilterViewDataInteractor @Inject constructor( .firstOrNull() RecordsFilterCommentViewData( id = 1L, // Only one at the time. - text = comment.orEmpty() + text = comment.orEmpty(), ).let(result::add) return@withContext result @@ -439,8 +440,8 @@ class RecordsFilterViewDataInteractor @Inject constructor( ?.plus( categoryViewDataMapper.mapToUntaggedItem( isFiltered = !selectedTags.hasUntaggedItem(), - isDarkTheme = isDarkTheme - ) + isDarkTheme = isDarkTheme, + ), ) .orEmpty() @@ -516,18 +517,12 @@ class RecordsFilterViewDataInteractor @Inject constructor( val selectedDays = filters.getDaysOfWeek() val isDarkTheme = prefsInteractor.getDarkMode() - return@withContext DayOfWeek.values().map { - val selected = it in selectedDays - DayOfWeekViewData( - dayOfWeek = it, - text = timeMapper.toShortDayOfWeekName(it), - color = if (selected) { - colorMapper.toActiveColor(isDarkTheme) - } else { - colorMapper.toInactiveColor(isDarkTheme) - }, - ) - } + return@withContext dayOfWeekViewDataMapper.mapViewData( + selectedDaysOfWeek = selectedDays, + isDarkTheme = isDarkTheme, + width = DayOfWeekViewData.Width.WrapContent, + paddingHorizontalDp = 16, + ) } suspend fun getTimeOfDayFilterSelectionViewData( @@ -543,12 +538,12 @@ class RecordsFilterViewDataInteractor @Inject constructor( timeStarted = timeMapper.formatTime( time = range.timeStarted + startOfDay, useMilitaryTime = useMilitaryTime, - showSeconds = false + showSeconds = false, ), timeEnded = timeMapper.formatTime( time = range.timeEnded + startOfDay, useMilitaryTime = useMilitaryTime, - showSeconds = false + showSeconds = false, ), gravity = RecordsFilterRangeViewData.Gravity.CENTER, separatorVisible = true,