Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 150e4597 authored by Michal Brzezinski's avatar Michal Brzezinski
Browse files

1/n refactoring: splitting ViewModels into separate smaller classes

Splitting ViewModels into smaller more cohesive classes with extracted common logic:
- GestureRecognizerAdapter transforms callback based GestureRecognizer into Flow and substitutes GestureFlowAdapter
- GestureRecognizerProvider which hides complexity of observing changes in resources and refreshing GestureRecognizer
- TouchpadGestureResources extracts common code for accessing latest values for distance and velocity

In that new class structure ViewModels responsibility is only to transform business state into Ui state that is to collect latest GestureState from GestureRecognizerAdapter and transform it into GestureUiState.

Bug: 384509663
Test: all unit tests
Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial
Change-Id: I2da7cbeb530a1d4de91746d22b8126fd74e7154b
parent d00d46e2
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -16,12 +16,13 @@

package com.android.systemui.touchpad.tutorial.ui.viewmodel

import android.content.res.mockResources
import android.view.MotionEvent
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.inputdevice.tutorial.inputDeviceTutorialLogger
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
@@ -34,18 +35,27 @@ import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState.Finis
import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState.InProgress
import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Companion.SWIPE_DISTANCE
import com.android.systemui.touchpad.tutorial.ui.gesture.ThreeFingerGesture
import com.android.systemui.touchpad.ui.gesture.touchpadGestureResources
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.whenever

@SmallTest
@RunWith(AndroidJUnit4::class)
class BackGestureScreenViewModelTest : SysuiTestCase() {

    private val kosmos = testKosmos()
    private val resources = kosmos.mockResources
    private val fakeConfigRepository = kosmos.fakeConfigurationRepository
    private val viewModel = BackGestureScreenViewModel(kosmos.configurationInteractor)
    private val viewModel =
        BackGestureScreenViewModel(
            GestureRecognizerAdapter(
                BackGestureRecognizerProvider(kosmos.touchpadGestureResources),
                kosmos.inputDeviceTutorialLogger,
            )
        )

    @Before
    fun before() {
@@ -115,10 +125,12 @@ class BackGestureScreenViewModelTest : SysuiTestCase() {
        }

    private fun setThresholdResource(threshold: Float) {
        fakeConfigRepository.setDimensionPixelSize(
            R.dimen.touchpad_tutorial_gestures_distance_threshold,
            (threshold).toInt(),
        whenever(
                resources.getDimensionPixelSize(
                    R.dimen.touchpad_tutorial_gestures_distance_threshold
                )
            )
            .thenReturn(threshold.toInt())
        fakeConfigRepository.onAnyConfigurationChange()
    }

+8 −1
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.view.MotionEvent
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.inputdevice.tutorial.inputDeviceTutorialLogger
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
@@ -36,7 +37,13 @@ import org.junit.runner.RunWith
class EasterEggGestureViewModelTest : SysuiTestCase() {

    private val kosmos = testKosmos()
    private val viewModel = EasterEggGestureViewModel()
    private val viewModel =
        EasterEggGestureViewModel(
            GestureRecognizerAdapter(
                EasterEggRecognizerProvider(),
                kosmos.inputDeviceTutorialLogger,
            )
        )

    @Before
    fun before() {
+14 −6
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.inputdevice.tutorial.inputDeviceTutorialLogger
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
@@ -37,6 +37,7 @@ import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Comp
import com.android.systemui.touchpad.tutorial.ui.gesture.ThreeFingerGesture
import com.android.systemui.touchpad.tutorial.ui.gesture.Velocity
import com.android.systemui.touchpad.ui.gesture.fakeVelocityTracker
import com.android.systemui.touchpad.ui.gesture.touchpadGestureResources
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -59,7 +60,12 @@ class HomeGestureScreenViewModelTest : SysuiTestCase() {
    private val resources = kosmos.mockResources

    private val viewModel =
        HomeGestureScreenViewModel(kosmos.configurationInteractor, resources, fakeVelocityTracker)
        HomeGestureScreenViewModel(
            GestureRecognizerAdapter(
                HomeGestureRecognizerProvider(kosmos.touchpadGestureResources, fakeVelocityTracker),
                kosmos.inputDeviceTutorialLogger,
            )
        )

    @Before
    fun before() {
@@ -126,10 +132,12 @@ class HomeGestureScreenViewModelTest : SysuiTestCase() {
        }

    private fun setDistanceThreshold(threshold: Float) {
        fakeConfigRepository.setDimensionPixelSize(
            R.dimen.touchpad_tutorial_gestures_distance_threshold,
            (threshold).toInt(),
        whenever(
                resources.getDimensionPixelSize(
                    R.dimen.touchpad_tutorial_gestures_distance_threshold
                )
            )
            .thenReturn(threshold.toInt())
        fakeConfigRepository.onAnyConfigurationChange()
    }

+9 −4
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.common.ui.data.repository.fakeConfigurationRepository
import com.android.systemui.common.ui.domain.interactor.configurationInteractor
import com.android.systemui.inputdevice.tutorial.inputDeviceTutorialLogger
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.collectLastValue
import com.android.systemui.kosmos.runTest
@@ -37,6 +37,7 @@ import com.android.systemui.touchpad.tutorial.ui.gesture.MultiFingerGesture.Comp
import com.android.systemui.touchpad.tutorial.ui.gesture.ThreeFingerGesture
import com.android.systemui.touchpad.tutorial.ui.gesture.Velocity
import com.android.systemui.touchpad.ui.gesture.fakeVelocityTracker
import com.android.systemui.touchpad.ui.gesture.touchpadGestureResources
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Test
@@ -60,9 +61,13 @@ class RecentAppsGestureScreenViewModelTest : SysuiTestCase() {

    private val viewModel =
        RecentAppsGestureScreenViewModel(
            kosmos.configurationInteractor,
            resources,
            GestureRecognizerAdapter(
                RecentAppsGestureRecognizerProvider(
                    kosmos.touchpadGestureResources,
                    fakeVelocityTracker,
                ),
                kosmos.inputDeviceTutorialLogger,
            )
        )

    @Before
+39 −1
Original line number Diff line number Diff line
@@ -30,9 +30,15 @@ import com.android.systemui.touchpad.tutorial.ui.composable.HomeGestureTutorialS
import com.android.systemui.touchpad.tutorial.ui.gesture.VelocityTracker
import com.android.systemui.touchpad.tutorial.ui.gesture.VerticalVelocityTracker
import com.android.systemui.touchpad.tutorial.ui.view.TouchpadTutorialActivity
import com.android.systemui.touchpad.tutorial.ui.viewmodel.BackGestureRecognizerProvider
import com.android.systemui.touchpad.tutorial.ui.viewmodel.BackGestureScreenViewModel
import com.android.systemui.touchpad.tutorial.ui.viewmodel.EasterEggGestureViewModel
import com.android.systemui.touchpad.tutorial.ui.viewmodel.EasterEggRecognizerProvider
import com.android.systemui.touchpad.tutorial.ui.viewmodel.GestureRecognizerAdapter
import com.android.systemui.touchpad.tutorial.ui.viewmodel.HomeGestureRecognizerProvider
import com.android.systemui.touchpad.tutorial.ui.viewmodel.HomeGestureScreenViewModel
import com.android.systemui.touchpad.tutorial.ui.viewmodel.RecentAppsGestureRecognizerProvider
import com.android.systemui.touchpad.tutorial.ui.viewmodel.RecentAppsGestureScreenViewModel
import dagger.Binds
import dagger.Module
import dagger.Provides
@@ -53,14 +59,46 @@ interface TouchpadTutorialModule {
        fun touchpadScreensProvider(
            backGestureScreenViewModel: BackGestureScreenViewModel,
            homeGestureScreenViewModel: HomeGestureScreenViewModel,
            easterEggGestureViewModel: EasterEggGestureViewModel,
        ): TouchpadTutorialScreensProvider {
            return ScreensProvider(
                backGestureScreenViewModel,
                homeGestureScreenViewModel,
                EasterEggGestureViewModel(),
                easterEggGestureViewModel,
            )
        }

        @Provides
        fun recentAppsViewModel(
            recognizerProvider: RecentAppsGestureRecognizerProvider,
            adapterFactory: GestureRecognizerAdapter.Factory,
        ): RecentAppsGestureScreenViewModel {
            return RecentAppsGestureScreenViewModel(adapterFactory.create(recognizerProvider))
        }

        @Provides
        fun backViewModel(
            recognizerProvider: BackGestureRecognizerProvider,
            adapterFactory: GestureRecognizerAdapter.Factory,
        ): BackGestureScreenViewModel {
            return BackGestureScreenViewModel(adapterFactory.create(recognizerProvider))
        }

        @Provides
        fun homeViewModel(
            recognizerProvider: HomeGestureRecognizerProvider,
            adapterFactory: GestureRecognizerAdapter.Factory,
        ): HomeGestureScreenViewModel {
            return HomeGestureScreenViewModel(adapterFactory.create(recognizerProvider))
        }

        @Provides
        fun easterEggViewModel(
            adapterFactory: GestureRecognizerAdapter.Factory
        ): EasterEggGestureViewModel {
            return EasterEggGestureViewModel(adapterFactory.create(EasterEggRecognizerProvider()))
        }

        @SysUISingleton
        @Provides
        fun touchpadGesturesInteractor(
Loading