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.

fix day of week view width

razeeman (Jan 3, 2024, 7:19 PM +0300) 3a3ac00e baf54bd2

+94 -47
+6 -5
features/feature_base_adapter/src/main/res/layout/item_day_of_week.xml
··· 5 5 android:id="@+id/containerDayOfWeekItem" 6 6 android:layout_width="wrap_content" 7 7 android:layout_height="wrap_content" 8 + android:layout_margin="2dp" 8 9 app:cardCornerRadius="@dimen/button_corner_radius" 9 - app:cardElevation="@dimen/record_type_card_elevation" 10 - app:cardPreventCornerOverlap="false" 11 - app:cardUseCompatPadding="true" 10 + app:cardElevation="2dp" 12 11 tools:cardBackgroundColor="?appInactiveColor"> 13 12 14 13 <androidx.appcompat.widget.AppCompatTextView 15 14 android:id="@+id/btnDayOfWeekItem" 16 - android:layout_width="wrap_content" 15 + android:layout_width="match_parent" 17 16 android:layout_height="wrap_content" 18 17 android:background="?selectableItemBackground" 19 - android:paddingHorizontal="16dp" 18 + android:gravity="center" 19 + android:maxLines="1" 20 20 android:paddingVertical="8dp" 21 21 android:textColor="?appLightTextColor" 22 22 android:textStyle="bold" 23 + tools:paddingHorizontal="16dp" 23 24 tools:text="Sun" /> 24 25 25 26 </androidx.cardview.widget.CardView>
+5 -2
features/feature_change_record_type/src/main/res/layout/change_record_type_goal_layout.xml
··· 3 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 4 xmlns:tools="http://schemas.android.com/tools" 5 5 android:layout_width="match_parent" 6 - android:layout_height="wrap_content"> 6 + android:layout_height="wrap_content" 7 + android:clipChildren="false"> 7 8 8 9 <androidx.appcompat.widget.AppCompatTextView 9 10 android:id="@+id/tvChangeRecordTypeGoalTitle" ··· 158 159 android:id="@+id/rvChangeRecordTypeGoalDays" 159 160 android:layout_width="match_parent" 160 161 android:layout_height="wrap_content" 161 - android:layout_marginHorizontal="12dp" 162 + android:layout_marginHorizontal="@dimen/input_field_margin" 163 + android:layout_marginBottom="2dp" 162 164 android:overScrollMode="never" 165 + app:layout_constraintBottom_toBottomOf="parent" 163 166 app:layout_constraintTop_toBottomOf="@id/containerChangeRecordTypeGoal" 164 167 tools:itemCount="1" 165 168 tools:listitem="@layout/item_day_of_week" />
+34
core/src/main/java/com/example/util/simpletimetracker/core/mapper/DayOfWeekViewDataMapper.kt
··· 1 + package com.example.util.simpletimetracker.core.mapper 2 + 3 + import com.example.util.simpletimetracker.domain.model.DayOfWeek 4 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 5 + import com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek.DayOfWeekViewData 6 + import javax.inject.Inject 7 + 8 + class DayOfWeekViewDataMapper @Inject constructor( 9 + private val timeMapper: TimeMapper, 10 + private val colorMapper: ColorMapper, 11 + ) { 12 + 13 + fun mapViewData( 14 + selectedDaysOfWeek: List<DayOfWeek>, 15 + isDarkTheme: Boolean, 16 + width: DayOfWeekViewData.Width, 17 + paddingHorizontalDp: Int, 18 + ): List<ViewHolderType> { 19 + return DayOfWeek.values().map { 20 + val selected = it in selectedDaysOfWeek 21 + DayOfWeekViewData( 22 + dayOfWeek = it, 23 + text = timeMapper.toShortDayOfWeekName(it), 24 + color = if (selected) { 25 + colorMapper.toActiveColor(isDarkTheme) 26 + } else { 27 + colorMapper.toInactiveColor(isDarkTheme) 28 + }, 29 + width = width, 30 + paddingHorizontalDp = paddingHorizontalDp, 31 + ) 32 + } 33 + } 34 + }
+15 -2
features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/dayOfWeek/DayOfWeekAdapterDelegate.kt
··· 1 1 package com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek 2 2 3 + import android.view.ViewGroup 4 + import androidx.core.view.updatePadding 3 5 import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate 6 + import com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek.DayOfWeekViewData.Width.MatchParent 7 + import com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek.DayOfWeekViewData.Width.WrapContent 8 + import com.example.util.simpletimetracker.feature_views.extension.dpToPx 4 9 import com.example.util.simpletimetracker.feature_views.extension.setOnClickWith 5 - import com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek.DayOfWeekViewData as ViewData 6 10 import com.example.util.simpletimetracker.feature_base_adapter.databinding.ItemDayOfWeekBinding as Binding 11 + import com.example.util.simpletimetracker.feature_base_adapter.dayOfWeek.DayOfWeekViewData as ViewData 7 12 8 13 fun createDayOfWeekAdapterDelegate( 9 14 onClick: (ViewData) -> Unit, 10 15 ) = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 11 - Binding::inflate 16 + Binding::inflate, 12 17 ) { binding, item, _ -> 13 18 14 19 with(binding) { 15 20 item as ViewData 16 21 22 + containerDayOfWeekItem.layoutParams.width = when (item.width) { 23 + is MatchParent -> ViewGroup.LayoutParams.MATCH_PARENT 24 + is WrapContent -> ViewGroup.LayoutParams.WRAP_CONTENT 25 + } 17 26 containerDayOfWeekItem.setCardBackgroundColor(item.color) 18 27 btnDayOfWeekItem.text = item.text 19 28 btnDayOfWeekItem.setOnClickWith(item, onClick) 29 + btnDayOfWeekItem.updatePadding( 30 + left = item.paddingHorizontalDp.dpToPx(), 31 + right = item.paddingHorizontalDp.dpToPx(), 32 + ) 20 33 } 21 34 }
+7
features/feature_base_adapter/src/main/java/com/example/util/simpletimetracker/feature_base_adapter/dayOfWeek/DayOfWeekViewData.kt
··· 8 8 val dayOfWeek: DayOfWeek, 9 9 val text: String, 10 10 @ColorInt val color: Int, 11 + val width: Width, 12 + val paddingHorizontalDp: Int, 11 13 ) : ViewHolderType { 12 14 13 15 override fun getUniqueId(): Long = dayOfWeek.ordinal.toLong() 14 16 15 17 override fun isValidType(other: ViewHolderType): Boolean = 16 18 other is DayOfWeekViewData 19 + 20 + sealed interface Width { 21 + object MatchParent : Width 22 + object WrapContent : Width 23 + } 17 24 }
+8 -14
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDataMapper.kt
··· 1 1 package com.example.util.simpletimetracker.feature_change_record_type.goals 2 2 3 - import com.example.util.simpletimetracker.core.mapper.ColorMapper 3 + import com.example.util.simpletimetracker.core.mapper.DayOfWeekViewDataMapper 4 4 import com.example.util.simpletimetracker.core.mapper.TimeMapper 5 5 import com.example.util.simpletimetracker.core.repo.ResourceRepo 6 6 import com.example.util.simpletimetracker.domain.extension.orZero ··· 17 17 class GoalsViewDataMapper @Inject constructor( 18 18 private val resourceRepo: ResourceRepo, 19 19 private val timeMapper: TimeMapper, 20 - private val colorMapper: ColorMapper, 20 + private val dayOfWeekViewDataMapper: DayOfWeekViewDataMapper, 21 21 ) { 22 22 23 23 private val goalTypeList: List<ChangeRecordTypeGoalsViewData.Type> = listOf( ··· 128 128 ): List<ViewHolderType> { 129 129 if (goal.value == 0L) return emptyList() 130 130 131 - return DayOfWeek.values().map { 132 - val selected = it in selectedDaysOfWeek 133 - DayOfWeekViewData( 134 - dayOfWeek = it, 135 - text = timeMapper.toShortDayOfWeekName(it), 136 - color = if (selected) { 137 - colorMapper.toActiveColor(isDarkTheme) 138 - } else { 139 - colorMapper.toInactiveColor(isDarkTheme) 140 - }, 141 - ) 142 - } 131 + return dayOfWeekViewDataMapper.mapViewData( 132 + selectedDaysOfWeek = selectedDaysOfWeek, 133 + isDarkTheme = isDarkTheme, 134 + width = DayOfWeekViewData.Width.MatchParent, 135 + paddingHorizontalDp = 2, 136 + ) 143 137 } 144 138 }
+1 -1
features/feature_change_record_type/src/main/java/com/example/util/simpletimetracker/feature_change_record_type/goals/GoalsViewDelegate.kt
··· 71 71 layoutManager = FlexboxLayoutManager(context).apply { 72 72 flexDirection = FlexDirection.ROW 73 73 justifyContent = JustifyContent.CENTER 74 - flexWrap = FlexWrap.WRAP 74 + flexWrap = FlexWrap.NOWRAP 75 75 } 76 76 adapter = dayOfWeekAdapter 77 77 }
+18 -23
features/feature_records_filter/src/main/java/com/example/util/simpletimetracker/feature_records_filter/interactor/RecordsFilterViewDataInteractor.kt
··· 6 6 import com.example.util.simpletimetracker.core.mapper.CategoryViewDataMapper 7 7 import com.example.util.simpletimetracker.core.mapper.ColorMapper 8 8 import com.example.util.simpletimetracker.core.mapper.DateDividerViewDataMapper 9 + import com.example.util.simpletimetracker.core.mapper.DayOfWeekViewDataMapper 9 10 import com.example.util.simpletimetracker.core.mapper.MultitaskRecordViewDataMapper 10 11 import com.example.util.simpletimetracker.core.mapper.RecordTypeViewDataMapper 11 12 import com.example.util.simpletimetracker.core.mapper.RecordViewDataMapper ··· 34 35 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 35 36 import com.example.util.simpletimetracker.domain.interactor.RecordInteractor 36 37 import com.example.util.simpletimetracker.domain.model.Category 37 - import com.example.util.simpletimetracker.domain.model.DayOfWeek 38 38 import com.example.util.simpletimetracker.domain.model.MultitaskRecord 39 39 import com.example.util.simpletimetracker.domain.model.Range 40 40 import com.example.util.simpletimetracker.domain.model.Record ··· 77 77 private val multitaskRecordViewDataMapper: MultitaskRecordViewDataMapper, 78 78 private val getRunningRecordViewDataMediator: GetRunningRecordViewDataMediator, 79 79 private val dateDividerViewDataMapper: DateDividerViewDataMapper, 80 + private val dayOfWeekViewDataMapper: DayOfWeekViewDataMapper, 80 81 private val colorMapper: ColorMapper, 81 82 private val timeMapper: TimeMapper, 82 83 private val resourceRepo: ResourceRepo, ··· 121 122 timestamp = timestamp, 122 123 type = DateTimeDialogType.DATETIME(initialTab = DateTimeDialogType.Tab.DATE), 123 124 useMilitaryTime = useMilitaryTime, 124 - firstDayOfWeek = firstDayOfWeek 125 + firstDayOfWeek = firstDayOfWeek, 125 126 ) 126 127 } 127 128 ··· 256 257 RecordFilterViewData.Type.DURATION, 257 258 RecordFilterViewData.Type.MANUALLY_FILTERED.takeIf { 258 259 filters.hasManuallyFiltered() && !hasUntracked && !hasMultitask 259 - } 260 + }, 260 261 ) 261 262 262 263 return@withContext availableFilters.mapIndexed { index, type -> ··· 324 325 ?.plus( 325 326 categoryViewDataMapper.mapToUncategorizedItem( 326 327 isFiltered = !selectedCategoryItems.hasUncategorizedItem(), 327 - isDarkTheme = isDarkTheme 328 - ) 328 + isDarkTheme = isDarkTheme, 329 + ), 329 330 ) 330 331 .orEmpty() 331 332 ··· 381 382 mapper.mapCommentFilter( 382 383 type = it, 383 384 filters = filters, 384 - isDarkTheme = isDarkTheme 385 + isDarkTheme = isDarkTheme, 385 386 ).let(result::add) 386 387 } 387 388 ··· 393 394 .firstOrNull() 394 395 RecordsFilterCommentViewData( 395 396 id = 1L, // Only one at the time. 396 - text = comment.orEmpty() 397 + text = comment.orEmpty(), 397 398 ).let(result::add) 398 399 399 400 return@withContext result ··· 439 440 ?.plus( 440 441 categoryViewDataMapper.mapToUntaggedItem( 441 442 isFiltered = !selectedTags.hasUntaggedItem(), 442 - isDarkTheme = isDarkTheme 443 - ) 443 + isDarkTheme = isDarkTheme, 444 + ), 444 445 ) 445 446 .orEmpty() 446 447 ··· 516 517 val selectedDays = filters.getDaysOfWeek() 517 518 val isDarkTheme = prefsInteractor.getDarkMode() 518 519 519 - return@withContext DayOfWeek.values().map { 520 - val selected = it in selectedDays 521 - DayOfWeekViewData( 522 - dayOfWeek = it, 523 - text = timeMapper.toShortDayOfWeekName(it), 524 - color = if (selected) { 525 - colorMapper.toActiveColor(isDarkTheme) 526 - } else { 527 - colorMapper.toInactiveColor(isDarkTheme) 528 - }, 529 - ) 530 - } 520 + return@withContext dayOfWeekViewDataMapper.mapViewData( 521 + selectedDaysOfWeek = selectedDays, 522 + isDarkTheme = isDarkTheme, 523 + width = DayOfWeekViewData.Width.WrapContent, 524 + paddingHorizontalDp = 16, 525 + ) 531 526 } 532 527 533 528 suspend fun getTimeOfDayFilterSelectionViewData( ··· 543 538 timeStarted = timeMapper.formatTime( 544 539 time = range.timeStarted + startOfDay, 545 540 useMilitaryTime = useMilitaryTime, 546 - showSeconds = false 541 + showSeconds = false, 547 542 ), 548 543 timeEnded = timeMapper.formatTime( 549 544 time = range.timeEnded + startOfDay, 550 545 useMilitaryTime = useMilitaryTime, 551 - showSeconds = false 546 + showSeconds = false, 552 547 ), 553 548 gravity = RecordsFilterRangeViewData.Gravity.CENTER, 554 549 separatorVisible = true,