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

Commit 81c6cdc7 authored by Michal Brzezinski's avatar Michal Brzezinski
Browse files

Removing GestureRecognizerProvider

This is to preapre the code for creating new GestureUiState - to  have better separation between Composable code and gesture logic.

GestureRecognizerProvider seems like overkill and it’s harder to reason about - with the only benefit being small code deduplication.
Simplifying the code by removing it.

Bug: 369817369
Test: code compiles, just small refactoring
Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial
Change-Id: I7331f8bb838bdeca4677c499554af1ef8b7edb93
parent ba22f9bf
Loading
Loading
Loading
Loading
+13 −8
Original line number Diff line number Diff line
@@ -16,15 +16,18 @@

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

import android.content.res.Resources
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import com.airbnb.lottie.compose.rememberLottieDynamicProperties
import com.android.compose.theme.LocalAndroidColorScheme
import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenConfig
import com.android.systemui.inputdevice.tutorial.ui.composable.rememberColorFilterProperty
import com.android.systemui.res.R
import com.android.systemui.touchpad.tutorial.ui.gesture.BackGestureRecognizer
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer

@Composable
fun BackGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Unit) {
@@ -44,15 +47,17 @@ fun BackGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni
                    successResId = R.raw.trackpad_back_success,
                ),
        )
    val gestureRecognizerProvider =
        DistanceBasedGestureRecognizerProvider(
            recognizerFactory = { distanceThresholdPx, gestureStateCallback ->
                BackGestureRecognizer(distanceThresholdPx).also {
                    it.addGestureStateCallback(gestureStateCallback)
                }
    val recognizer = rememberBackGestureRecognizer(LocalContext.current.resources)
    GestureTutorialScreen(screenConfig, recognizer, onDoneButtonClicked, onBack)
}

@Composable
private fun rememberBackGestureRecognizer(resources: Resources): GestureRecognizer {
    val distance =
        resources.getDimensionPixelSize(
            com.android.internal.R.dimen.system_gestures_distance_threshold
        )
    GestureTutorialScreen(screenConfig, gestureRecognizerProvider, onDoneButtonClicked, onBack)
    return remember(distance) { BackGestureRecognizer(distance) }
}

@Composable
+4 −38
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

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

import android.content.res.Resources
import androidx.activity.compose.BackHandler
import androidx.compose.animation.core.Animatable
import androidx.compose.animation.core.tween
@@ -32,7 +31,6 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.pointer.pointerInteropFilter
import androidx.compose.ui.platform.LocalContext
import com.android.systemui.inputdevice.tutorial.ui.composable.ActionTutorialContent
import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState
import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenConfig
@@ -44,36 +42,6 @@ import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted
import com.android.systemui.touchpad.tutorial.ui.gesture.TouchpadGestureHandler

interface GestureRecognizerProvider {

    @Composable
    fun rememberGestureRecognizer(
        resources: Resources,
        gestureStateChangedCallback: (GestureState) -> Unit,
    ): GestureRecognizer
}

typealias gestureStateCallback = (GestureState) -> Unit

class DistanceBasedGestureRecognizerProvider(
    val recognizerFactory: (Int, gestureStateCallback) -> GestureRecognizer
) : GestureRecognizerProvider {

    @Composable
    override fun rememberGestureRecognizer(
        resources: Resources,
        gestureStateChangedCallback: (GestureState) -> Unit,
    ): GestureRecognizer {
        val distanceThresholdPx =
            resources.getDimensionPixelSize(
                com.android.internal.R.dimen.system_gestures_distance_threshold
            ) * 5
        return remember(distanceThresholdPx) {
            recognizerFactory(distanceThresholdPx, gestureStateChangedCallback)
        }
    }
}

fun GestureState.toTutorialActionState(): TutorialActionState {
    return when (this) {
        NotStarted -> TutorialActionState.NotStarted
@@ -86,18 +54,16 @@ fun GestureState.toTutorialActionState(): TutorialActionState {
@Composable
fun GestureTutorialScreen(
    screenConfig: TutorialScreenConfig,
    gestureRecognizerProvider: GestureRecognizerProvider,
    gestureRecognizer: GestureRecognizer,
    onDoneButtonClicked: () -> Unit,
    onBack: () -> Unit,
) {
    BackHandler(onBack = onBack)
    var gestureState: GestureState by remember { mutableStateOf(NotStarted) }
    var easterEggTriggered by remember { mutableStateOf(false) }
    val gestureRecognizer =
        gestureRecognizerProvider.rememberGestureRecognizer(
            resources = LocalContext.current.resources,
            gestureStateChangedCallback = { gestureState = it },
        )
    LaunchedEffect(gestureRecognizer) {
        gestureRecognizer.addGestureStateCallback { gestureState = it }
    }
    val easterEggMonitor = EasterEggGestureMonitor { easterEggTriggered = true }
    val gestureHandler =
        remember(gestureRecognizer) { TouchpadGestureHandler(gestureRecognizer, easterEggMonitor) }
+13 −8
Original line number Diff line number Diff line
@@ -16,13 +16,16 @@

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

import android.content.res.Resources
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import com.airbnb.lottie.compose.rememberLottieDynamicProperties
import com.android.compose.theme.LocalAndroidColorScheme
import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenConfig
import com.android.systemui.inputdevice.tutorial.ui.composable.rememberColorFilterProperty
import com.android.systemui.res.R
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer
import com.android.systemui.touchpad.tutorial.ui.gesture.HomeGestureRecognizer

@Composable
@@ -43,15 +46,17 @@ fun HomeGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni
                    successResId = R.raw.trackpad_home_success,
                ),
        )
    val gestureRecognizerProvider =
        DistanceBasedGestureRecognizerProvider(
            recognizerFactory = { distanceThresholdPx, gestureStateCallback ->
                HomeGestureRecognizer(distanceThresholdPx).also {
                    it.addGestureStateCallback(gestureStateCallback)
                }
    val recognizer = rememberHomeGestureRecognizer(LocalContext.current.resources)
    GestureTutorialScreen(screenConfig, recognizer, onDoneButtonClicked, onBack)
}

@Composable
private fun rememberHomeGestureRecognizer(resources: Resources): GestureRecognizer {
    val distance =
        resources.getDimensionPixelSize(
            com.android.internal.R.dimen.system_gestures_distance_threshold
        )
    GestureTutorialScreen(screenConfig, gestureRecognizerProvider, onDoneButtonClicked, onBack)
    return remember(distance) { HomeGestureRecognizer(distance) }
}

@Composable
+13 −21
Original line number Diff line number Diff line
@@ -19,13 +19,13 @@ package com.android.systemui.touchpad.tutorial.ui.composable
import android.content.res.Resources
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import com.airbnb.lottie.compose.rememberLottieDynamicProperties
import com.android.compose.theme.LocalAndroidColorScheme
import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenConfig
import com.android.systemui.inputdevice.tutorial.ui.composable.rememberColorFilterProperty
import com.android.systemui.res.R
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer
import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState
import com.android.systemui.touchpad.tutorial.ui.gesture.RecentAppsGestureRecognizer

@Composable
@@ -46,26 +46,18 @@ fun RecentAppsGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: ()
                    successResId = R.raw.trackpad_recent_apps_success,
                ),
        )
    val gestureRecognizerProvider =
        object : GestureRecognizerProvider {
    val recognizer = rememberRecentAppsGestureRecognizer(LocalContext.current.resources)
    GestureTutorialScreen(screenConfig, recognizer, onDoneButtonClicked, onBack)
}

@Composable
            override fun rememberGestureRecognizer(
                resources: Resources,
                gestureStateChangedCallback: (GestureState) -> Unit,
            ): GestureRecognizer {
                val distanceThresholdPx =
private fun rememberRecentAppsGestureRecognizer(resources: Resources): GestureRecognizer {
    val distance =
        resources.getDimensionPixelSize(
            com.android.internal.R.dimen.system_gestures_distance_threshold
        )
                val velocityThresholdPxPerMs =
                    resources.getDimension(R.dimen.touchpad_recent_apps_gesture_velocity_threshold)
                return remember(distanceThresholdPx, velocityThresholdPxPerMs) {
                    RecentAppsGestureRecognizer(distanceThresholdPx, velocityThresholdPxPerMs)
                        .also { it.addGestureStateCallback(gestureStateChangedCallback) }
                }
            }
        }
    GestureTutorialScreen(screenConfig, gestureRecognizerProvider, onDoneButtonClicked, onBack)
    val velocity = resources.getDimension(R.dimen.touchpad_recent_apps_gesture_velocity_threshold)
    return remember(distance, velocity) { RecentAppsGestureRecognizer(distance, velocity) }
}

@Composable