1 /* <lambda>null2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.touchpad.tutorial.ui.viewmodel 18 19 import android.view.MotionEvent 20 import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState 21 import com.android.systemui.res.R 22 import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection 23 import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState 24 import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress 25 import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted 26 import com.android.systemui.touchpad.tutorial.ui.gesture.handleTouchpadMotionEvent 27 import com.android.systemui.util.kotlin.pairwiseBy 28 import kotlinx.coroutines.flow.Flow 29 30 class BackGestureScreenViewModel(val gestureRecognizer: GestureRecognizerAdapter) : 31 TouchpadTutorialScreenViewModel { 32 33 override val tutorialState: Flow<TutorialActionState> = 34 gestureRecognizer.gestureState 35 .pairwiseBy(NotStarted) { previous, current -> 36 current to toAnimationProperties(current, previous) 37 } 38 .mapToTutorialState() 39 40 override fun handleEvent(event: MotionEvent): Boolean { 41 return gestureRecognizer.handleTouchpadMotionEvent(event) 42 } 43 44 private fun toAnimationProperties( 45 current: GestureState, 46 previous: GestureState, 47 ): TutorialAnimationProperties { 48 val (startMarker, endMarker) = 49 if (current is InProgress && current.direction == GestureDirection.LEFT) { 50 "gesture to L" to "end progress L" 51 } else "gesture to R" to "end progress R" 52 return TutorialAnimationProperties( 53 progressStartMarker = startMarker, 54 progressEndMarker = endMarker, 55 successAnimation = successAnimation(previous), 56 ) 57 } 58 59 private fun successAnimation(previous: GestureState): Int { 60 return if (previous is InProgress && previous.direction == GestureDirection.LEFT) { 61 R.raw.trackpad_back_success_left 62 } else R.raw.trackpad_back_success_right 63 } 64 } 65