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.

add screen reset on tab reselection

razeeman (Jan 14, 2023, 3:28 PM +0300) 30c8731f 115e9b85

+231 -42
+1 -9
core/src/main/java/com/example/util/simpletimetracker/core/base/SingleLiveEvent.kt
··· 25 25 } 26 26 27 27 @MainThread 28 - override fun setValue(t: T?) { 28 + override fun setValue(t: T) { 29 29 mPending.set(true) 30 30 super.setValue(t) 31 - } 32 - 33 - /** 34 - * Used for cases where T is Void, to make calls cleaner. 35 - */ 36 - @MainThread 37 - fun call() { 38 - value = null 39 31 } 40 32 }
+8
core/src/main/java/com/example/util/simpletimetracker/core/model/NavigationTab.kt
··· 1 + package com.example.util.simpletimetracker.core.model 2 + 3 + sealed interface NavigationTab { 4 + object RunningRecords : NavigationTab 5 + object Records : NavigationTab 6 + object Statistics : NavigationTab 7 + object Settings : NavigationTab 8 + }
+21
core/src/main/java/com/example/util/simpletimetracker/core/sharedViewModel/MainTabsViewModel.kt
··· 1 + package com.example.util.simpletimetracker.core.sharedViewModel 2 + 3 + import androidx.lifecycle.LiveData 4 + import androidx.lifecycle.MutableLiveData 5 + import androidx.lifecycle.ViewModel 6 + import com.example.util.simpletimetracker.core.extension.set 7 + import com.example.util.simpletimetracker.core.model.NavigationTab 8 + import javax.inject.Inject 9 + 10 + class MainTabsViewModel @Inject constructor() : ViewModel() { 11 + 12 + val tabReselected: LiveData<NavigationTab?> = MutableLiveData() 13 + 14 + fun onTabReselected(tab: NavigationTab) { 15 + tabReselected.set(tab) 16 + } 17 + 18 + fun onHandled() { 19 + tabReselected.set(null) 20 + } 21 + }
+50
features/feature_main/src/main/java/com/example/util/simpletimetracker/feature_main/mapper/MainMapper.kt
··· 1 + package com.example.util.simpletimetracker.feature_main.mapper 2 + 3 + import androidx.annotation.DrawableRes 4 + import com.example.util.simpletimetracker.core.model.NavigationTab 5 + import com.example.util.simpletimetracker.core.utils.SHORTCUT_NAVIGATION_RECORDS 6 + import com.example.util.simpletimetracker.core.utils.SHORTCUT_NAVIGATION_SETTINGS 7 + import com.example.util.simpletimetracker.core.utils.SHORTCUT_NAVIGATION_STATISTICS 8 + import com.example.util.simpletimetracker.feature_main.R 9 + import javax.inject.Inject 10 + 11 + class MainMapper @Inject constructor() { 12 + 13 + fun mapPositionToTab(position: Int): NavigationTab? { 14 + return when (position) { 15 + 0 -> NavigationTab.RunningRecords 16 + 1 -> NavigationTab.Records 17 + 2 -> NavigationTab.Statistics 18 + 3 -> NavigationTab.Settings 19 + else -> null 20 + } 21 + } 22 + 23 + fun mapTabToPosition(tab: NavigationTab): Int { 24 + return when (tab) { 25 + NavigationTab.RunningRecords -> 0 26 + NavigationTab.Records -> 1 27 + NavigationTab.Statistics -> 2 28 + NavigationTab.Settings -> 3 29 + } 30 + } 31 + 32 + fun mapNavigationToTab(value: String): NavigationTab? { 33 + return when (value) { 34 + SHORTCUT_NAVIGATION_RECORDS -> NavigationTab.Records 35 + SHORTCUT_NAVIGATION_STATISTICS -> NavigationTab.Statistics 36 + SHORTCUT_NAVIGATION_SETTINGS -> NavigationTab.Settings 37 + else -> null 38 + } 39 + } 40 + 41 + @DrawableRes fun mapToIcon(tab: NavigationTab?): Int { 42 + return when (tab) { 43 + NavigationTab.RunningRecords -> R.drawable.ic_tab_running_records 44 + NavigationTab.Records -> R.drawable.ic_tab_records 45 + NavigationTab.Statistics -> R.drawable.ic_tab_statistics 46 + NavigationTab.Settings -> R.drawable.ic_tab_settings 47 + else -> R.drawable.unknown 48 + } 49 + } 50 + }
+26 -19
features/feature_main/src/main/java/com/example/util/simpletimetracker/feature_main/view/MainFragment.kt
··· 1 1 package com.example.util.simpletimetracker.feature_main.view 2 2 3 + import com.example.util.simpletimetracker.feature_main.databinding.MainFragmentBinding as Binding 3 4 import android.graphics.ColorFilter 4 5 import android.view.LayoutInflater 5 6 import android.view.ViewGroup ··· 12 13 import com.example.util.simpletimetracker.core.di.BaseViewModelFactory 13 14 import com.example.util.simpletimetracker.core.extension.getThemedAttr 14 15 import com.example.util.simpletimetracker.core.sharedViewModel.BackupViewModel 16 + import com.example.util.simpletimetracker.core.sharedViewModel.MainTabsViewModel 15 17 import com.example.util.simpletimetracker.core.utils.SHORTCUT_NAVIGATION_KEY 16 - import com.example.util.simpletimetracker.core.utils.SHORTCUT_NAVIGATION_RECORDS 17 - import com.example.util.simpletimetracker.core.utils.SHORTCUT_NAVIGATION_SETTINGS 18 - import com.example.util.simpletimetracker.core.utils.SHORTCUT_NAVIGATION_STATISTICS 19 18 import com.example.util.simpletimetracker.feature_main.R 20 19 import com.example.util.simpletimetracker.feature_main.adapter.MainContentAdapter 20 + import com.example.util.simpletimetracker.feature_main.mapper.MainMapper 21 21 import com.example.util.simpletimetracker.feature_main.viewModel.MainViewModel 22 22 import com.example.util.simpletimetracker.feature_views.extension.visible 23 23 import com.google.android.material.tabs.TabLayout 24 24 import com.google.android.material.tabs.TabLayoutMediator 25 25 import dagger.hilt.android.AndroidEntryPoint 26 26 import javax.inject.Inject 27 - import com.example.util.simpletimetracker.feature_main.databinding.MainFragmentBinding as Binding 28 27 29 28 @AndroidEntryPoint 30 29 class MainFragment : BaseFragment<Binding>() { ··· 34 33 35 34 @Inject 36 35 lateinit var viewModelFactory: BaseViewModelFactory<MainViewModel> 36 + 37 37 @Inject 38 38 lateinit var backupViewModelFactory: BaseViewModelFactory<BackupViewModel> 39 + 40 + @Inject 41 + lateinit var mainTabsViewModelFactory: BaseViewModelFactory<MainTabsViewModel> 42 + 43 + @Inject 44 + lateinit var mainMapper: MainMapper 39 45 40 46 private val viewModel: MainViewModel by viewModels( 41 47 factoryProducer = { viewModelFactory } ··· 43 49 private val backupViewModel: BackupViewModel by viewModels( 44 50 ownerProducer = { activity as AppCompatActivity }, 45 51 factoryProducer = { backupViewModelFactory } 52 + ) 53 + private val mainTabsViewModel: MainTabsViewModel by viewModels( 54 + ownerProducer = { activity as AppCompatActivity }, 55 + factoryProducer = { mainTabsViewModelFactory } 46 56 ) 47 57 48 58 private val selectedColorFilter by lazy { getColorFilter(R.attr.appTabSelectedColor) } ··· 63 73 mainPager.offscreenPageLimit = 3 // Same as number of pages to avoid recreating. 64 74 65 75 TabLayoutMediator(mainTabs, mainPager) { tab, position -> 66 - when (position) { 67 - 0 -> R.drawable.ic_tab_running_records 68 - 1 -> R.drawable.ic_tab_records 69 - 2 -> R.drawable.ic_tab_statistics 70 - 3 -> R.drawable.ic_tab_settings 71 - else -> R.drawable.unknown 72 - }.let(tab::setIcon) 76 + position 77 + .let(mainMapper::mapPositionToTab) 78 + .let(mainMapper::mapToIcon) 79 + .let(tab::setIcon) 73 80 74 81 tab.icon?.colorFilter = if (position == 0) { 75 82 selectedColorFilter ··· 80 87 81 88 mainTabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { 82 89 override fun onTabReselected(tab: TabLayout.Tab?) { 83 - // Do nothing 90 + tab?.position 91 + ?.let(mainMapper::mapPositionToTab) 92 + ?.let(mainTabsViewModel::onTabReselected) 84 93 } 85 94 86 95 override fun onTabUnselected(tab: TabLayout.Tab?) { ··· 94 103 } 95 104 96 105 private fun checkForShortcutNavigation() = with(binding) { 97 - val extras = activity?.intent?.extras 98 - 99 - when (extras?.getString(SHORTCUT_NAVIGATION_KEY)) { 100 - SHORTCUT_NAVIGATION_RECORDS -> mainPager.setCurrentItem(1, true) 101 - SHORTCUT_NAVIGATION_STATISTICS -> mainPager.setCurrentItem(2, true) 102 - SHORTCUT_NAVIGATION_SETTINGS -> mainPager.setCurrentItem(3, true) 103 - } 106 + activity?.intent?.extras 107 + ?.getString(SHORTCUT_NAVIGATION_KEY) 108 + ?.let(mainMapper::mapNavigationToTab) 109 + ?.let(mainMapper::mapTabToPosition) 110 + ?.let { mainPager.setCurrentItem(it, true) } 104 111 } 105 112 106 113 private fun getColorFilter(@AttrRes attrRes: Int): ColorFilter? {
+8
features/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/customView/RecordsCalendarView.kt
··· 224 224 invalidate() 225 225 } 226 226 227 + fun reset() { 228 + scaleFactor = 1f 229 + lastScaleFactor = 1f 230 + panFactor = 0f 231 + lastPanFactor = 0f 232 + invalidate() 233 + } 234 + 227 235 private fun initArgs( 228 236 context: Context, 229 237 attrs: AttributeSet? = null,
+17 -1
features/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/view/RecordsFragment.kt
··· 10 10 import androidx.recyclerview.widget.LinearLayoutManager 11 11 import com.example.util.simpletimetracker.core.base.BaseFragment 12 12 import com.example.util.simpletimetracker.core.di.BaseViewModelFactory 13 + import com.example.util.simpletimetracker.core.sharedViewModel.MainTabsViewModel 13 14 import com.example.util.simpletimetracker.core.sharedViewModel.RemoveRecordViewModel 14 15 import com.example.util.simpletimetracker.domain.extension.orZero 15 16 import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter ··· 35 36 @Inject 36 37 lateinit var removeRecordViewModelFactory: BaseViewModelFactory<RemoveRecordViewModel> 37 38 39 + @Inject 40 + lateinit var mainTabsViewModelFactory: BaseViewModelFactory<MainTabsViewModel> 41 + 38 42 private val viewModel: RecordsViewModel by viewModels( 39 43 factoryProducer = { viewModelFactory } 40 44 ) 41 45 private val removeRecordViewModel: RemoveRecordViewModel by viewModels( 42 46 ownerProducer = { activity as AppCompatActivity }, 43 47 factoryProducer = { removeRecordViewModelFactory } 48 + ) 49 + private val mainTabsViewModel: MainTabsViewModel by viewModels( 50 + ownerProducer = { activity as AppCompatActivity }, 51 + factoryProducer = { mainTabsViewModelFactory } 44 52 ) 45 53 private val recordsAdapter: BaseRecyclerAdapter by lazy { 46 54 BaseRecyclerAdapter( ··· 70 78 binding.viewRecordsCalendar.setClickListener(viewModel::onRecordClick) 71 79 } 72 80 73 - override fun initViewModel() { 81 + override fun initViewModel() = with(binding) { 74 82 with(viewModel) { 75 83 extra = RecordsExtra(shift = arguments?.getInt(ARGS_POSITION).orZero()) 76 84 isCalendarView.observe(::switchState) 77 85 records.observe(recordsAdapter::replace) 78 86 calendarData.observe(binding.viewRecordsCalendar::setData) 87 + resetScreen.observe { 88 + rvRecordsList.smoothScrollToPosition(0) 89 + viewRecordsCalendar.reset() 90 + mainTabsViewModel.onHandled() 91 + } 79 92 } 80 93 with(removeRecordViewModel) { 81 94 needUpdate.observe { ··· 84 97 removeRecordViewModel.onUpdated() 85 98 } 86 99 } 100 + } 101 + with(mainTabsViewModel) { 102 + tabReselected.observe(viewModel::onTabReselected) 87 103 } 88 104 } 89 105
+12
features/feature_records/src/main/java/com/example/util/simpletimetracker/feature_records/viewModel/RecordsViewModel.kt
··· 4 4 import androidx.lifecycle.MutableLiveData 5 5 import androidx.lifecycle.ViewModel 6 6 import androidx.lifecycle.viewModelScope 7 + import com.example.util.simpletimetracker.core.base.SingleLiveEvent 7 8 import com.example.util.simpletimetracker.core.extension.set 8 9 import com.example.util.simpletimetracker.core.extension.toParams 10 + import com.example.util.simpletimetracker.core.model.NavigationTab 9 11 import com.example.util.simpletimetracker.domain.extension.orZero 10 12 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor 11 13 import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType ··· 38 40 MutableLiveData(listOf(LoaderViewData() as ViewHolderType)) 39 41 } 40 42 val calendarData: LiveData<RecordsCalendarViewData> = MutableLiveData() 43 + val resetScreen: SingleLiveEvent<Unit> = SingleLiveEvent() 41 44 45 + private var isVisible: Boolean = false 42 46 private var timerJob: Job? = null 43 47 private val shift: Int get() = extra?.shift.orZero() 44 48 ··· 75 79 } 76 80 77 81 fun onVisible() { 82 + isVisible = true 78 83 if (shift == 0) { 79 84 startUpdate() 80 85 } else { ··· 83 88 } 84 89 85 90 fun onHidden() { 91 + isVisible = false 86 92 stopUpdate() 87 93 } 88 94 89 95 fun onNeedUpdate() { 90 96 updateRecords() 97 + } 98 + 99 + fun onTabReselected(tab: NavigationTab?) { 100 + if (isVisible && tab is NavigationTab.Records) { 101 + resetScreen.set(Unit) 102 + } 91 103 } 92 104 93 105 private fun updateRecords() = viewModelScope.launch {
+27 -9
features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/view/RunningRecordsFragment.kt
··· 1 1 package com.example.util.simpletimetracker.feature_running_records.view 2 2 3 + import com.example.util.simpletimetracker.feature_running_records.databinding.RunningRecordsFragmentBinding as Binding 3 4 import android.view.LayoutInflater 4 5 import android.view.ViewGroup 6 + import androidx.appcompat.app.AppCompatActivity 5 7 import androidx.fragment.app.viewModels 6 - import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter 7 - import com.example.util.simpletimetracker.feature_base_adapter.divider.createDividerAdapterDelegate 8 - import com.example.util.simpletimetracker.feature_base_adapter.empty.createEmptyAdapterDelegate 9 - import com.example.util.simpletimetracker.feature_base_adapter.loader.createLoaderAdapterDelegate 10 8 import com.example.util.simpletimetracker.core.base.BaseFragment 11 9 import com.example.util.simpletimetracker.core.di.BaseViewModelFactory 12 10 import com.example.util.simpletimetracker.core.dialog.OnTagSelectedListener 11 + import com.example.util.simpletimetracker.core.sharedViewModel.MainTabsViewModel 12 + import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter 13 + import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.createActivityFilterAdapterDelegate 14 + import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.createActivityFilterAddAdapterDelegate 15 + import com.example.util.simpletimetracker.feature_base_adapter.divider.createDividerAdapterDelegate 16 + import com.example.util.simpletimetracker.feature_base_adapter.empty.createEmptyAdapterDelegate 17 + import com.example.util.simpletimetracker.feature_base_adapter.loader.createLoaderAdapterDelegate 13 18 import com.example.util.simpletimetracker.feature_running_records.adapter.createRunningRecordAdapterDelegate 14 19 import com.example.util.simpletimetracker.feature_running_records.adapter.createRunningRecordTypeAdapterDelegate 15 20 import com.example.util.simpletimetracker.feature_running_records.adapter.createRunningRecordTypeAddAdapterDelegate ··· 20 25 import com.google.android.flexbox.JustifyContent 21 26 import dagger.hilt.android.AndroidEntryPoint 22 27 import javax.inject.Inject 23 - import com.example.util.simpletimetracker.feature_running_records.databinding.RunningRecordsFragmentBinding as Binding 24 - import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.createActivityFilterAdapterDelegate 25 - import com.example.util.simpletimetracker.feature_base_adapter.activityFilter.createActivityFilterAddAdapterDelegate 26 28 27 29 @AndroidEntryPoint 28 30 class RunningRecordsFragment : ··· 35 37 @Inject 36 38 lateinit var viewModelFactory: BaseViewModelFactory<RunningRecordsViewModel> 37 39 40 + @Inject 41 + lateinit var mainTabsViewModelFactory: BaseViewModelFactory<MainTabsViewModel> 42 + 38 43 private val viewModel: RunningRecordsViewModel by viewModels( 39 44 factoryProducer = { viewModelFactory } 45 + ) 46 + private val mainTabsViewModel: MainTabsViewModel by viewModels( 47 + ownerProducer = { activity as AppCompatActivity }, 48 + factoryProducer = { mainTabsViewModelFactory } 40 49 ) 41 50 42 51 private val runningRecordsAdapter: BaseRecyclerAdapter by lazy { ··· 71 80 } 72 81 } 73 82 74 - override fun initViewModel(): Unit = with(viewModel) { 75 - runningRecords.observe(runningRecordsAdapter::replace) 83 + override fun initViewModel() = with(binding) { 84 + with(viewModel) { 85 + runningRecords.observe(runningRecordsAdapter::replace) 86 + resetScreen.observe { 87 + rvRunningRecordsList.smoothScrollToPosition(0) 88 + mainTabsViewModel.onHandled() 89 + } 90 + } 91 + with(mainTabsViewModel) { 92 + tabReselected.observe(viewModel::onTabReselected) 93 + } 76 94 } 77 95 78 96 override fun onResume() {
+10
features/feature_running_records/src/main/java/com/example/util/simpletimetracker/feature_running_records/viewModel/RunningRecordsViewModel.kt
··· 4 4 import androidx.lifecycle.MutableLiveData 5 5 import androidx.lifecycle.ViewModel 6 6 import androidx.lifecycle.viewModelScope 7 + import com.example.util.simpletimetracker.core.base.SingleLiveEvent 8 + import com.example.util.simpletimetracker.core.extension.set 7 9 import com.example.util.simpletimetracker.core.extension.toParams 10 + import com.example.util.simpletimetracker.core.model.NavigationTab 8 11 import com.example.util.simpletimetracker.domain.interactor.AddRunningRecordMediator 9 12 import com.example.util.simpletimetracker.domain.interactor.RemoveRunningRecordMediator 10 13 import com.example.util.simpletimetracker.domain.interactor.ActivityFilterInteractor ··· 41 44 val runningRecords: LiveData<List<ViewHolderType>> by lazy { 42 45 MutableLiveData(listOf(LoaderViewData() as ViewHolderType)) 43 46 } 47 + val resetScreen: SingleLiveEvent<Unit> = SingleLiveEvent() 44 48 45 49 private var timerJob: Job? = null 46 50 ··· 150 154 151 155 fun onTagSelected() { 152 156 updateRunningRecords() 157 + } 158 + 159 + fun onTabReselected(tab: NavigationTab?) { 160 + if (tab is NavigationTab.RunningRecords) { 161 + resetScreen.set(Unit) 162 + } 153 163 } 154 164 155 165 private fun showTagSelection(typeId: Long) {
+15
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/view/SettingsFragment.kt
··· 25 25 import javax.inject.Inject 26 26 import com.example.util.simpletimetracker.feature_settings.databinding.SettingsFragmentBinding as Binding 27 27 import androidx.core.view.isVisible 28 + import com.example.util.simpletimetracker.core.sharedViewModel.MainTabsViewModel 28 29 import com.example.util.simpletimetracker.feature_settings.viewData.SettingsDurationViewData 29 30 30 31 @AndroidEntryPoint ··· 44 45 @Inject 45 46 lateinit var backupViewModelFactory: BaseViewModelFactory<BackupViewModel> 46 47 48 + @Inject 49 + lateinit var mainTabsViewModelFactory: BaseViewModelFactory<MainTabsViewModel> 50 + 47 51 private val viewModel: SettingsViewModel by viewModels( 48 52 factoryProducer = { viewModelFactory } 49 53 ) 50 54 private val backupViewModel: BackupViewModel by viewModels( 51 55 ownerProducer = { activity as AppCompatActivity }, 52 56 factoryProducer = { backupViewModelFactory } 57 + ) 58 + private val mainTabsViewModel: MainTabsViewModel by viewModels( 59 + ownerProducer = { activity as AppCompatActivity }, 60 + factoryProducer = { mainTabsViewModelFactory } 53 61 ) 54 62 55 63 override fun initUi() = with(binding) { ··· 151 159 keepScreenOnCheckbox.observe(::setKeepScreenOn) 152 160 showRecordTagSelectionCheckbox.observe(::updateShowRecordTagSelectionChecked) 153 161 themeChanged.observe(::changeTheme) 162 + resetScreen.observe { 163 + containerSettings.smoothScrollTo(0, 0) 164 + mainTabsViewModel.onHandled() 165 + } 166 + } 167 + with(mainTabsViewModel) { 168 + tabReselected.observe(viewModel::onTabReselected) 154 169 } 155 170 } 156 171
+9
features/feature_settings/src/main/java/com/example/util/simpletimetracker/feature_settings/viewModel/SettingsViewModel.kt
··· 5 5 import androidx.lifecycle.ViewModel 6 6 import androidx.lifecycle.viewModelScope 7 7 import com.example.util.simpletimetracker.core.BuildConfig 8 + import com.example.util.simpletimetracker.core.base.SingleLiveEvent 8 9 import com.example.util.simpletimetracker.core.extension.set 9 10 import com.example.util.simpletimetracker.core.interactor.CheckExactAlarmPermissionInteractor 11 + import com.example.util.simpletimetracker.core.model.NavigationTab 10 12 import com.example.util.simpletimetracker.core.provider.ApplicationDataProvider 11 13 import com.example.util.simpletimetracker.core.repo.ResourceRepo 12 14 import com.example.util.simpletimetracker.core.sharedViewModel.BackupViewModel.Companion.CSV_EXPORT_DIALOG_TAG ··· 268 270 val themeChanged: LiveData<Boolean> = MutableLiveData(false) 269 271 val settingsDisplayVisibility: LiveData<Boolean> = MutableLiveData(false) 270 272 val settingsAdditionalVisibility: LiveData<Boolean> = MutableLiveData(false) 273 + val resetScreen: SingleLiveEvent<Unit> = SingleLiveEvent() 271 274 272 275 fun onVisible() { 273 276 // Need to update card order because it changes on card order dialog ··· 571 574 router.navigate( 572 575 settingsMapper.toAutomatedTrackingHelpDialog() 573 576 ) 577 + } 578 + 579 + fun onTabReselected(tab: NavigationTab?) { 580 + if (tab is NavigationTab.Settings) { 581 + resetScreen.set(Unit) 582 + } 574 583 } 575 584 576 585 private fun openCardOrderDialog(cardOrder: CardOrder) {
+19 -4
features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/view/StatisticsFragment.kt
··· 13 13 import com.example.util.simpletimetracker.core.dialog.ChartFilterDialogListener 14 14 import com.example.util.simpletimetracker.core.extension.getThemedAttr 15 15 import com.example.util.simpletimetracker.core.repo.DeviceRepo 16 + import com.example.util.simpletimetracker.core.sharedViewModel.MainTabsViewModel 16 17 import com.example.util.simpletimetracker.domain.extension.orZero 17 18 import com.example.util.simpletimetracker.feature_base_adapter.BaseRecyclerAdapter 18 19 import com.example.util.simpletimetracker.feature_base_adapter.ViewHolderType ··· 41 42 Binding::inflate 42 43 43 44 @Inject 45 + lateinit var viewModelFactory: BaseViewModelFactory<StatisticsViewModel> 46 + 47 + @Inject 44 48 lateinit var settingsViewModelFactory: BaseViewModelFactory<StatisticsSettingsViewModel> 45 49 46 50 @Inject 47 - lateinit var viewModelFactory: BaseViewModelFactory<StatisticsViewModel> 51 + lateinit var mainTabsViewModelFactory: BaseViewModelFactory<MainTabsViewModel> 48 52 49 53 @Inject 50 54 lateinit var deviceRepo: DeviceRepo 51 55 56 + private val viewModel: StatisticsViewModel by viewModels( 57 + factoryProducer = { viewModelFactory } 58 + ) 52 59 private val settingsViewModel: StatisticsSettingsViewModel by viewModels( 53 60 ownerProducer = { activity as AppCompatActivity }, 54 61 factoryProducer = { settingsViewModelFactory } 55 62 ) 56 - private val viewModel: StatisticsViewModel by viewModels( 57 - factoryProducer = { viewModelFactory } 63 + private val mainTabsViewModel: MainTabsViewModel by viewModels( 64 + ownerProducer = { activity as AppCompatActivity }, 65 + factoryProducer = { mainTabsViewModelFactory } 58 66 ) 59 67 60 68 private val statisticsAdapter: BaseRecyclerAdapter by lazy { buildAdapter() } ··· 73 81 } 74 82 } 75 83 76 - override fun initViewModel() { 84 + override fun initViewModel() = with(binding) { 77 85 with(viewModel) { 78 86 extra = StatisticsExtra(shift = arguments?.getInt(ARGS_POSITION).orZero()) 79 87 statistics.observe(statisticsAdapter::replace) 80 88 sharingData.observe(::onNewSharingData) 89 + resetScreen.observe { 90 + rvStatisticsList.smoothScrollToPosition(0) 91 + mainTabsViewModel.onHandled() 92 + } 81 93 } 82 94 with(settingsViewModel) { 83 95 rangeUpdated.observe { viewModel.onRangeUpdated() } 96 + } 97 + with(mainTabsViewModel) { 98 + tabReselected.observe(viewModel::onTabReselected) 84 99 } 85 100 } 86 101
+8
features/feature_statistics/src/main/java/com/example/util/simpletimetracker/feature_statistics/viewModel/StatisticsViewModel.kt
··· 8 8 import com.example.util.simpletimetracker.core.extension.set 9 9 import com.example.util.simpletimetracker.core.extension.toParams 10 10 import com.example.util.simpletimetracker.core.interactor.SharingInteractor 11 + import com.example.util.simpletimetracker.core.model.NavigationTab 11 12 import com.example.util.simpletimetracker.core.utils.UNTRACKED_ITEM_ID 12 13 import com.example.util.simpletimetracker.domain.extension.orZero 13 14 import com.example.util.simpletimetracker.domain.interactor.PrefsInteractor ··· 42 43 MutableLiveData(listOf(LoaderViewData() as ViewHolderType)) 43 44 } 44 45 val sharingData: SingleLiveEvent<List<ViewHolderType>> = SingleLiveEvent() 46 + val resetScreen: SingleLiveEvent<Unit> = SingleLiveEvent() 45 47 46 48 private var isVisible: Boolean = false 47 49 private var timerJob: Job? = null ··· 124 126 125 127 fun onShareView(view: Any) = viewModelScope.launch { 126 128 sharingInteractor.execute(view, SHARING_NAME) 129 + } 130 + 131 + fun onTabReselected(tab: NavigationTab?) { 132 + if (isVisible && tab is NavigationTab.Statistics) { 133 + resetScreen.set(Unit) 134 + } 127 135 } 128 136 129 137 private fun updateStatistics() = viewModelScope.launch {