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 rating settings block to recycler

razeeman (Jan 8, 2024, 7:54 PM +0300) 1d8d10d6 924f8f3a

+74 -127
-4
features/feature_settings/src/main/res/layout/settings_fragment.xml
··· 23 23 tools:listitem="@layout/item_settings_text" /> 24 24 25 25 <include 26 - android:id="@+id/layoutSettingsRating" 27 - layout="@layout/settings_rate_layout" /> 28 - 29 - <include 30 26 android:id="@+id/layoutSettingsNotifications" 31 27 layout="@layout/settings_notifications_layout" /> 32 28
-94
features/feature_settings/src/main/res/layout/settings_rate_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:tools="http://schemas.android.com/tools" 4 - style="@style/SettingsCard" 5 - android:layout_width="match_parent" 6 - android:layout_height="wrap_content"> 7 - 8 - <LinearLayout 9 - android:layout_width="match_parent" 10 - android:layout_height="wrap_content" 11 - android:orientation="vertical" 12 - android:paddingTop="8dp" 13 - android:paddingBottom="8dp"> 14 - 15 - <LinearLayout 16 - android:id="@+id/layoutSettingsRate" 17 - android:layout_width="match_parent" 18 - android:layout_height="wrap_content" 19 - android:background="?selectableItemBackground" 20 - android:clickable="true" 21 - android:focusable="true" 22 - android:orientation="vertical"> 23 - 24 - <androidx.appcompat.widget.AppCompatTextView 25 - style="@style/SettingsText" 26 - android:layout_width="match_parent" 27 - android:layout_height="wrap_content" 28 - android:paddingBottom="0dp" 29 - android:text="@string/settings_rate" /> 30 - 31 - <androidx.appcompat.widget.AppCompatTextView 32 - style="@style/SettingsSecondaryText" 33 - android:layout_width="match_parent" 34 - android:layout_height="wrap_content" 35 - android:text="@string/settings_rate_description" /> 36 - 37 - </LinearLayout> 38 - 39 - <View 40 - style="@style/SettingsDivider" 41 - android:layout_width="match_parent" /> 42 - 43 - <LinearLayout 44 - android:id="@+id/layoutSettingsFeedback" 45 - android:layout_width="match_parent" 46 - android:layout_height="wrap_content" 47 - android:background="?selectableItemBackground" 48 - android:clickable="true" 49 - android:focusable="true" 50 - android:orientation="vertical"> 51 - 52 - <androidx.appcompat.widget.AppCompatTextView 53 - style="@style/SettingsText" 54 - android:layout_width="match_parent" 55 - android:layout_height="wrap_content" 56 - android:paddingBottom="0dp" 57 - android:text="@string/settings_feedback" /> 58 - 59 - <androidx.appcompat.widget.AppCompatTextView 60 - style="@style/SettingsSecondaryText" 61 - android:layout_width="match_parent" 62 - android:layout_height="wrap_content" 63 - android:text="@string/settings_feedback_description" /> 64 - 65 - </LinearLayout> 66 - 67 - <View 68 - style="@style/SettingsDivider" 69 - android:layout_width="match_parent" /> 70 - 71 - <LinearLayout 72 - android:layout_width="match_parent" 73 - android:layout_height="wrap_content" 74 - android:orientation="vertical"> 75 - 76 - <androidx.appcompat.widget.AppCompatTextView 77 - style="@style/SettingsText" 78 - android:layout_width="match_parent" 79 - android:layout_height="wrap_content" 80 - android:paddingBottom="0dp" 81 - android:text="@string/settings_version" /> 82 - 83 - <androidx.appcompat.widget.AppCompatTextView 84 - android:id="@+id/tvSettingsVersionName" 85 - style="@style/SettingsSecondaryText" 86 - android:layout_width="match_parent" 87 - android:layout_height="wrap_content" 88 - tools:text="1.0" /> 89 - 90 - </LinearLayout> 91 - 92 - </LinearLayout> 93 - 94 - </androidx.cardview.widget.CardView>
+6
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/adapter/SettingsBlock.kt
··· 9 9 Archive, 10 10 DataEdit, 11 11 MainBottom, 12 + 13 + RatingTop, 14 + RateUs, 15 + Feedback, 16 + Version, 17 + RatingBottom, 12 18 }
+60
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/interactor/SettingsRatingViewDataInteractor.kt
··· 1 + package com.example.util.simpletimetracker.feature_settings.interactor 2 + 3 + import com.example.util.simpletimetracker.core.BuildConfig 4 + import com.example.util.simpletimetracker.core.provider.ApplicationDataProvider 5 + import com.example.util.simpletimetracker.core.repo.ResourceRepo 6 + import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 7 + import com.example.util.simpletimetracker.feature_settings.R 8 + import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBlock 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 javax.inject.Inject 13 + 14 + class SettingsRatingViewDataInteractor @Inject constructor( 15 + private val resourceRepo: ResourceRepo, 16 + private val applicationDataProvider: ApplicationDataProvider, 17 + ) { 18 + 19 + fun execute(): List<ViewHolderType> { 20 + val result = mutableListOf<ViewHolderType>() 21 + 22 + result += SettingsTopViewData( 23 + block = SettingsBlock.RatingTop, 24 + ) 25 + 26 + result += SettingsTextViewData( 27 + block = SettingsBlock.RateUs, 28 + title = resourceRepo.getString(R.string.settings_rate), 29 + subtitle = resourceRepo.getString(R.string.settings_rate_description), 30 + ) 31 + 32 + result += SettingsTextViewData( 33 + block = SettingsBlock.Feedback, 34 + title = resourceRepo.getString(R.string.settings_feedback), 35 + subtitle = resourceRepo.getString(R.string.settings_feedback_description), 36 + ) 37 + 38 + result += SettingsTextViewData( 39 + block = SettingsBlock.Version, 40 + title = resourceRepo.getString(R.string.settings_version), 41 + subtitle = loadVersionName(), 42 + dividerIsVisible = false, 43 + ) 44 + 45 + result += SettingsBottomViewData( 46 + block = SettingsBlock.RatingBottom, 47 + ) 48 + 49 + return result 50 + } 51 + 52 + private fun loadVersionName(): String { 53 + val appVersion = applicationDataProvider.getAppVersion() 54 + return if (BuildConfig.DEBUG) { 55 + "$appVersion ${BuildConfig.BUILD_TYPE}" 56 + } else { 57 + appVersion 58 + } 59 + } 60 + }
-13
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 147 147 } 148 148 } 149 149 150 - with(layoutSettingsRating) { 151 - with(viewModel.ratingDelegate) { 152 - layoutSettingsRate.setOnClick(::onRateClick) 153 - layoutSettingsFeedback.setOnClick(::onFeedbackClick) 154 - } 155 - } 156 - 157 150 with(layoutSettingsBackup) { 158 151 layoutSettingsBackupTitle.setOnClick(viewModel::onSettingsBackupClick) 159 152 layoutSettingsSaveBackup.setOnClick(backupViewModel::onSaveClick) ··· 261 254 repeatButtonViewData.observe(::updateRepeatButtonViewData) 262 255 startOfDayViewData.observe(::updateStartOfDayViewData) 263 256 showRecordTagSelectionCheckbox.observe(::updateShowRecordTagSelectionChecked) 264 - } 265 - } 266 - 267 - with(viewModel.ratingDelegate) { 268 - with(layoutSettingsRating) { 269 - versionName.observe(tvSettingsVersionName::setText) 270 257 } 271 258 } 272 259
+5
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt
··· 13 13 import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType 14 14 import com.example.util.simpletimetracker.feature_settings.adapter.SettingsBlock 15 15 import com.example.util.simpletimetracker.feature_settings.interactor.SettingsMainViewDataInteractor 16 + import com.example.util.simpletimetracker.feature_settings.interactor.SettingsRatingViewDataInteractor 16 17 import com.example.util.simpletimetracker.feature_settings.mapper.SettingsMapper 17 18 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsAdditionalViewModelDelegate 18 19 import com.example.util.simpletimetracker.feature_settings.viewModel.delegate.SettingsDisplayViewModelDelegate ··· 39 40 private val router: Router, 40 41 private val settingsMapper: SettingsMapper, 41 42 private val settingsMainViewDataInteractor: SettingsMainViewDataInteractor, 43 + private val settingsRatingViewDataInteractor: SettingsRatingViewDataInteractor, 42 44 ) : BaseViewModel(), SettingsParent { 43 45 44 46 val content: LiveData<List<ViewHolderType>> by lazySuspend { loadContent() } ··· 84 86 SettingsBlock.Categories -> mainDelegate.onEditCategoriesClick() 85 87 SettingsBlock.Archive -> mainDelegate.onArchiveClick() 86 88 SettingsBlock.DataEdit -> mainDelegate.onDataEditClick() 89 + SettingsBlock.RateUs -> ratingDelegate.onRateClick() 90 + SettingsBlock.Feedback -> ratingDelegate.onFeedbackClick() 87 91 else -> { 88 92 // Do nothing 89 93 } ··· 199 203 private suspend fun loadContent(): List<ViewHolderType> { 200 204 val result = mutableListOf<ViewHolderType>() 201 205 result += settingsMainViewDataInteractor.execute() 206 + result += settingsRatingViewDataInteractor.execute() 202 207 return result 203 208 } 204 209
+3 -16
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/delegate/SettingsRatingViewModelDelegate.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 - import com.example.util.simpletimetracker.core.BuildConfig 6 3 import com.example.util.simpletimetracker.core.base.ViewModelDelegate 7 4 import com.example.util.simpletimetracker.core.provider.ApplicationDataProvider 8 5 import com.example.util.simpletimetracker.core.repo.ResourceRepo ··· 19 16 private val applicationDataProvider: ApplicationDataProvider, 20 17 ) : ViewModelDelegate() { 21 18 22 - val versionName: LiveData<String> 23 - by lazy { MutableLiveData(loadVersionName()) } 24 - 25 19 fun onRateClick() { 26 - router.execute(OpenMarketParams(packageName = applicationDataProvider.getPackageName())) 20 + router.execute( 21 + OpenMarketParams(packageName = applicationDataProvider.getPackageName()), 22 + ) 27 23 } 28 24 29 25 fun onFeedbackClick() { ··· 40 36 private fun showMessage(stringResId: Int) { 41 37 val params = SnackBarParams(message = resourceRepo.getString(stringResId)) 42 38 router.show(params) 43 - } 44 - 45 - private fun loadVersionName(): String { 46 - val appVersion = applicationDataProvider.getAppVersion() 47 - return if (BuildConfig.DEBUG) { 48 - "$appVersion ${BuildConfig.BUILD_TYPE}" 49 - } else { 50 - appVersion 51 - } 52 39 } 53 40 }