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.

change translators settings block to recycler

razeeman (Jan 20, 2024, 4:01 PM +0300) aea9fd7f f2c0489f

+92 -93
+12
features/feature_settings/src/main/res/layout/item_settings_translator.xml
··· 5 5 android:layout_width="match_parent" 6 6 android:layout_height="wrap_content"> 7 7 8 + <com.google.android.material.card.MaterialCardView 9 + style="@style/SettingsCard" 10 + android:layout_width="match_parent" 11 + android:layout_height="0dp" 12 + android:scaleY="2.5" 13 + app:layout_constraintBottom_toBottomOf="parent" 14 + app:layout_constraintTop_toTopOf="parent" /> 15 + 8 16 <androidx.appcompat.widget.AppCompatTextView 9 17 android:id="@+id/tvItemSettingsTranslators" 10 18 style="@style/SettingsTranslatorsText" 11 19 android:layout_width="0dp" 12 20 android:layout_height="wrap_content" 21 + android:layout_marginStart="4dp" 22 + android:translationZ="4dp" 13 23 app:layout_constraintBottom_toBottomOf="parent" 14 24 app:layout_constraintEnd_toStartOf="@id/tvItemSettingsTranslatorsLanguage" 15 25 app:layout_constraintStart_toStartOf="parent" ··· 21 31 style="@style/SettingsTranslatorsText" 22 32 android:layout_width="wrap_content" 23 33 android:layout_height="wrap_content" 34 + android:layout_marginEnd="4dp" 24 35 android:gravity="end" 36 + android:translationZ="4dp" 25 37 app:layout_constraintBottom_toBottomOf="parent" 26 38 app:layout_constraintEnd_toEndOf="parent" 27 39 app:layout_constraintStart_toEndOf="@id/tvItemSettingsTranslators"
-4
features/feature_settings/src/main/res/layout/settings_fragment.xml
··· 22 22 tools:itemCount="3" 23 23 tools:listitem="@layout/item_settings_text" /> 24 24 25 - <include 26 - android:id="@+id/layoutSettingsTranslators" 27 - layout="@layout/settings_translators_layout" /> 28 - 29 25 </LinearLayout> 30 26 31 27 </androidx.core.widget.NestedScrollView>
-40
features/feature_settings/src/main/res/layout/settings_translators_layout.xml
··· 1 - <?xml version="1.0" encoding="utf-8"?> 2 - <androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 3 - xmlns:app="http://schemas.android.com/apk/res-auto" 4 - xmlns:tools="http://schemas.android.com/tools" 5 - style="@style/SettingsCard" 6 - android:layout_width="match_parent" 7 - android:layout_height="wrap_content"> 8 - 9 - <androidx.appcompat.widget.LinearLayoutCompat 10 - android:layout_width="match_parent" 11 - android:layout_height="wrap_content" 12 - android:orientation="vertical" 13 - android:paddingTop="8dp" 14 - android:paddingBottom="8dp"> 15 - 16 - <androidx.appcompat.widget.AppCompatTextView 17 - android:id="@+id/tvSettingsTranslators" 18 - style="@style/SettingsText" 19 - android:layout_width="match_parent" 20 - android:layout_height="wrap_content" 21 - android:text="@string/settings_translators" 22 - app:layout_constraintTop_toTopOf="parent" /> 23 - 24 - <View 25 - android:id="@+id/viewSettingsTranslatorsDividerIndonesian" 26 - style="@style/SettingsDivider" 27 - android:layout_width="match_parent" 28 - app:layout_constraintTop_toBottomOf="@id/tvSettingsTranslators" /> 29 - 30 - <androidx.recyclerview.widget.RecyclerView 31 - android:id="@+id/rvSettingsTranslators" 32 - android:layout_width="match_parent" 33 - android:layout_height="wrap_content" 34 - android:orientation="vertical" 35 - app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" 36 - tools:listitem="@layout/item_settings_translator" /> 37 - 38 - </androidx.appcompat.widget.LinearLayoutCompat> 39 - 40 - </androidx.cardview.widget.CardView>
+4
core/src/main/java/com/example/util/simpletimetracker/core/viewData/SettingsBlock.kt
··· 82 82 ExportSpreadsheetImportHint, 83 83 ExportIcs, 84 84 ExportBottom, 85 + 86 + TranslatorsTop, 87 + TranslatorsTitle, 88 + TranslatorsBottom, 85 89 }
+12 -1
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsTranslatorAdapterDelegate.kt
··· 1 1 package com.example.util.simpletimetracker.feature_settings.adapter 2 2 3 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 3 4 import com.example.util.simpletimetracker.feature_base_adapter.createRecyclerBindingAdapterDelegate 4 5 import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTranslatorViewData as ViewData 5 6 import com.example.util.simpletimetracker.feature_settings.databinding.ItemSettingsTranslatorBinding as Binding 6 7 7 8 fun createSettingsTranslatorAdapterDelegate() = createRecyclerBindingAdapterDelegate<ViewData, Binding>( 8 - Binding::inflate 9 + Binding::inflate, 9 10 ) { binding, item, _ -> 10 11 11 12 with(binding) { ··· 14 15 tvItemSettingsTranslators.text = item.translator 15 16 tvItemSettingsTranslatorsLanguage.text = item.language 16 17 } 18 + } 19 + 20 + data class SettingsTranslatorViewData( 21 + val translator: String, 22 + val language: String, 23 + ) : ViewHolderType { 24 + 25 + override fun getUniqueId(): Long = translator.hashCode().toLong() 26 + 27 + override fun isValidType(other: ViewHolderType): Boolean = other is ViewData 17 28 }
-14
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsTranslatorViewData.kt
··· 1 - package com.example.util.simpletimetracker.feature_settings.adapter 2 - 3 - import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 4 - 5 - data class SettingsTranslatorViewData( 6 - val translator: String, 7 - val language: String, 8 - ) : ViewHolderType { 9 - 10 - override fun getUniqueId(): Long = translator.hashCode().toLong() 11 - 12 - override fun isValidType(other: ViewHolderType): Boolean = 13 - other is SettingsTranslatorViewData 14 - }
+55
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsTranslatorsViewDataInteractor.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.interactor 2 + 3 + import com.example.util.simpletimetracker.core.interactor.LanguageInteractor 4 + import com.example.util.simpletimetracker.core.repo.ResourceRepo 5 + import com.example.util.simpletimetracker.core.viewData.SettingsBlock 6 + import com.example.util.simpletimetracker.domain.interactor.AppLanguage 7 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 8 + import com.example.util.simpletimetracker.feature_settings.R 9 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBottomViewData 10 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTextViewData 11 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTopViewData 12 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTranslatorViewData 13 + import javax.inject.Inject 14 + 15 + class SettingsTranslatorsViewDataInteractor @Inject constructor( 16 + private val resourceRepo: ResourceRepo, 17 + private val languageInteractor: LanguageInteractor, 18 + ) { 19 + 20 + fun execute(): List<ViewHolderType> { 21 + val result = mutableListOf<ViewHolderType>() 22 + 23 + result += SettingsTopViewData( 24 + block = SettingsBlock.TranslatorsTop, 25 + ) 26 + 27 + result += SettingsTextViewData( 28 + block = SettingsBlock.TranslatorsTitle, 29 + title = resourceRepo.getString(R.string.settings_translators), 30 + subtitle = "", 31 + layoutIsClickable = false, 32 + ) 33 + 34 + result += loadTranslatorsViewData() 35 + 36 + result += SettingsBottomViewData( 37 + block = SettingsBlock.TranslatorsBottom, 38 + ) 39 + 40 + return result 41 + } 42 + 43 + private fun loadTranslatorsViewData(): List<SettingsTranslatorViewData> { 44 + val nonTranslatable = listOf(AppLanguage.System, AppLanguage.English) 45 + 46 + return LanguageInteractor.languageList 47 + .filter { it !in nonTranslatable } 48 + .map { 49 + SettingsTranslatorViewData( 50 + translator = languageInteractor.getTranslators(it), 51 + language = languageInteractor.getDisplayName(it), 52 + ) 53 + } 54 + } 55 + }
-15
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/mapper/SettingsMapper.kt
··· 17 17 import com.example.util.simpletimetracker.core.utils.EXTRA_RECORD_COMMENT 18 18 import com.example.util.simpletimetracker.core.utils.EXTRA_RECORD_TAG_NAME 19 19 import com.example.util.simpletimetracker.domain.extension.orZero 20 - import com.example.util.simpletimetracker.domain.interactor.AppLanguage 21 20 import com.example.util.simpletimetracker.domain.interactor.DarkMode 22 21 import com.example.util.simpletimetracker.domain.model.CardOrder 23 22 import com.example.util.simpletimetracker.domain.model.DayOfWeek ··· 26 25 import com.example.util.simpletimetracker.domain.model.WidgetTransparencyPercent 27 26 import com.example.util.simpletimetracker.domain.model.count 28 27 import com.example.util.simpletimetracker.feature_settings.R 29 - import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTranslatorViewData 30 28 import com.example.util.simpletimetracker.feature_settings.viewData.CardOrderViewData 31 29 import com.example.util.simpletimetracker.feature_settings.viewData.DarkModeViewData 32 30 import com.example.util.simpletimetracker.feature_settings.viewData.DaysInCalendarViewData ··· 327 325 forceSeconds = false, 328 326 useProportionalMinutes = useProportionalMinutes, 329 327 ) 330 - } 331 - 332 - fun mapTranslatorsViewData(): List<SettingsTranslatorViewData> { 333 - val nonTranslatable = listOf(AppLanguage.System, AppLanguage.English) 334 - 335 - return LanguageInteractor.languageList 336 - .filter { it !in nonTranslatable } 337 - .map { 338 - SettingsTranslatorViewData( 339 - translator = languageInteractor.getTranslators(it), 340 - language = languageInteractor.getDisplayName(it), 341 - ) 342 - } 343 328 } 344 329 345 330 private fun toPosition(cardOrder: CardOrder): Int {
+2 -8
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 58 58 private val backupViewModel: BackupViewModel by activityViewModels { backupViewModelFactory } 59 59 private val mainTabsViewModel: MainTabsViewModel by activityViewModels { mainTabsViewModelFactory } 60 60 61 - private val translatorsAdapter: BaseRecyclerAdapter by lazy { 62 - BaseRecyclerAdapter( 63 - createSettingsTranslatorAdapterDelegate(), 64 - ) 65 - } 66 61 private val contentAdapter: BaseRecyclerAdapter by lazy { 67 62 BaseRecyclerAdapter( 68 63 createSettingsTopAdapterDelegate(), 69 64 createSettingsBottomAdapterDelegate(), 65 + createSettingsTranslatorAdapterDelegate(), 66 + createSettingsHintAdapterDelegate(), 70 67 createSettingsTextAdapterDelegate(throttle(::onTextClicked)), 71 68 createSettingsTextWithButtonAdapterDelegate(::onButtonClicked), 72 69 createSettingsCheckboxAdapterDelegate(::onCheckboxClicked), ··· 75 72 createSettingsSpinnerNotCheckableAdapterDelegate(viewModel::onSpinnerPositionSelected), 76 73 createSettingsCollapseAdapterDelegate(viewModel::onCollapseClicked), 77 74 createSettingsSelectorAdapterDelegate(viewModel::onSelectorClicked), 78 - createSettingsHintAdapterDelegate(), 79 75 createSettingsRangeAdapterDelegate( 80 76 onStartClick = viewModel::onRangeStartClicked, 81 77 onEndClick = viewModel::onRangeEndClicked, ··· 99 95 override fun initUi() = with(binding) { 100 96 rvSettingsContent.adapter = contentAdapter 101 97 rvSettingsContent.itemAnimator = null 102 - layoutSettingsTranslators.rvSettingsTranslators.adapter = translatorsAdapter 103 98 } 104 99 105 100 override fun initViewModel(): Unit = with(binding) { ··· 110 105 } 111 106 viewModel.mainDelegate.themeChanged.observe(::changeTheme) 112 107 viewModel.displayDelegate.keepScreenOnCheckbox.observe(::setKeepScreenOn) 113 - viewModel.translatorsDelegate.translatorsViewData.observe(translatorsAdapter::replaceAsNew) 114 108 backupViewModel.requestScreenUpdate.observe { viewModel.onRequestUpdate() } 115 109 mainTabsViewModel.tabReselected.observe(viewModel::onTabReselected) 116 110 }
+2 -1
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt
··· 30 30 class SettingsViewModel @Inject constructor( 31 31 val mainDelegate: SettingsMainViewModelDelegate, 32 32 val displayDelegate: SettingsDisplayViewModelDelegate, 33 - val translatorsDelegate: SettingsTranslatorsViewModelDelegate, 34 33 private val router: Router, 35 34 private val settingsMapper: SettingsMapper, 36 35 private val ratingDelegate: SettingsRatingViewModelDelegate, ··· 38 37 private val additionalDelegate: SettingsAdditionalViewModelDelegate, 39 38 private val backupDelegate: SettingsBackupViewModelDelegate, 40 39 private val exportDelegate: SettingsExportViewModelDelegate, 40 + private val translatorsDelegate: SettingsTranslatorsViewModelDelegate, 41 41 ) : BaseViewModel(), SettingsParent { 42 42 43 43 val content: LiveData<List<ViewHolderType>> by lazySuspend { loadContent() } ··· 314 314 result += additionalDelegate.getViewData() 315 315 result += backupDelegate.getViewData() 316 316 result += exportDelegate.getViewData() 317 + result += translatorsDelegate.getViewData() 317 318 return result 318 319 } 319 320
+5 -10
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsTranslatorsViewModelDelegate.kt
··· 1 1 package com.example.util.simpletimetracker.feature_settings.viewModel.delegate 2 2 3 - import androidx.lifecycle.LiveData 4 - import androidx.lifecycle.MutableLiveData 5 3 import com.example.util.simpletimetracker.core.base.ViewModelDelegate 6 - import com.example.util.simpletimetracker.feature_settings.adapter.SettingsTranslatorViewData 7 - import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 4 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 5 + import com.example.util.simpletimetracker.feature_settings.interactor.SettingsTranslatorsViewDataInteractor 8 6 import javax.inject.Inject 9 7 10 8 class SettingsTranslatorsViewModelDelegate @Inject constructor( 11 - private val settingsMapper: SettingsMapper, 9 + private val settingsTranslatorsViewDataInteractor: SettingsTranslatorsViewDataInteractor, 12 10 ) : ViewModelDelegate() { 13 11 14 - val translatorsViewData: LiveData<List<SettingsTranslatorViewData>> 15 - by lazy { MutableLiveData(loadTranslatorsViewData()) } 16 - 17 - private fun loadTranslatorsViewData(): List<SettingsTranslatorViewData> { 18 - return settingsMapper.mapTranslatorsViewData() 12 + fun getViewData(): List<ViewHolderType> { 13 + return settingsTranslatorsViewDataInteractor.execute() 19 14 } 20 15 }