1 /*
2  * 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.view
18 
19 import android.os.Bundle
20 import android.view.WindowManager
21 import androidx.activity.ComponentActivity
22 import androidx.activity.compose.setContent
23 import androidx.activity.enableEdgeToEdge
24 import androidx.activity.viewModels
25 import androidx.compose.runtime.Composable
26 import androidx.compose.runtime.getValue
27 import androidx.compose.runtime.mutableStateOf
28 import androidx.compose.runtime.remember
29 import androidx.compose.runtime.setValue
30 import androidx.lifecycle.Lifecycle.State.STARTED
31 import androidx.lifecycle.compose.collectAsStateWithLifecycle
32 import com.android.compose.theme.PlatformTheme
33 import com.android.systemui.inputdevice.tutorial.InputDeviceTutorialLogger
34 import com.android.systemui.inputdevice.tutorial.InputDeviceTutorialLogger.TutorialContext
35 import com.android.systemui.inputdevice.tutorial.KeyboardTouchpadTutorialMetricsLogger
36 import com.android.systemui.res.R
37 import com.android.systemui.touchpad.tutorial.ui.composable.BackGestureTutorialScreen
38 import com.android.systemui.touchpad.tutorial.ui.composable.HomeGestureTutorialScreen
39 import com.android.systemui.touchpad.tutorial.ui.composable.RecentAppsGestureTutorialScreen
40 import com.android.systemui.touchpad.tutorial.ui.composable.TutorialSelectionScreen
41 import com.android.systemui.touchpad.tutorial.ui.viewmodel.Screen.BACK_GESTURE
42 import com.android.systemui.touchpad.tutorial.ui.viewmodel.Screen.HOME_GESTURE
43 import com.android.systemui.touchpad.tutorial.ui.viewmodel.Screen.RECENT_APPS_GESTURE
44 import com.android.systemui.touchpad.tutorial.ui.viewmodel.Screen.TUTORIAL_SELECTION
45 import com.android.systemui.touchpad.tutorial.ui.viewmodel.TouchpadTutorialViewModel
46 import javax.inject.Inject
47 
48 class TouchpadTutorialActivity
49 @Inject
50 constructor(
51     private val viewModelFactory: TouchpadTutorialViewModel.Factory,
52     private val logger: InputDeviceTutorialLogger,
53     private val metricsLogger: KeyboardTouchpadTutorialMetricsLogger,
54 ) : ComponentActivity() {
55 
<lambda>null56     private val vm by viewModels<TouchpadTutorialViewModel>(factoryProducer = { viewModelFactory })
57 
onCreatenull58     override fun onCreate(savedInstanceState: Bundle?) {
59         super.onCreate(savedInstanceState)
60         enableEdgeToEdge()
61         setTitle(getString(R.string.launch_touchpad_tutorial_notification_content))
62         setContent {
63             PlatformTheme { TouchpadTutorialScreen(vm, closeTutorial = ::finishTutorial) }
64         }
65         // required to handle 3+ fingers on touchpad
66         window.addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY)
67         metricsLogger.logPeripheralTutorialLaunchedFromSettings()
68         logger.logOpenTutorial(TutorialContext.TOUCHPAD_TUTORIAL)
69     }
70 
finishTutorialnull71     private fun finishTutorial() {
72         logger.logCloseTutorial(TutorialContext.TOUCHPAD_TUTORIAL)
73         finish()
74     }
75 
onResumenull76     override fun onResume() {
77         super.onResume()
78         vm.onOpened()
79     }
80 
onPausenull81     override fun onPause() {
82         super.onPause()
83         vm.onClosed()
84     }
85 }
86 
87 @Composable
TouchpadTutorialScreennull88 fun TouchpadTutorialScreen(vm: TouchpadTutorialViewModel, closeTutorial: () -> Unit) {
89     val activeScreen by vm.screen.collectAsStateWithLifecycle(STARTED)
90     var lastSelectedScreen by remember { mutableStateOf(TUTORIAL_SELECTION) }
91     when (activeScreen) {
92         TUTORIAL_SELECTION ->
93             TutorialSelectionScreen(
94                 onBackTutorialClicked = {
95                     lastSelectedScreen = BACK_GESTURE
96                     vm.goTo(BACK_GESTURE)
97                 },
98                 onHomeTutorialClicked = {
99                     lastSelectedScreen = HOME_GESTURE
100                     vm.goTo(HOME_GESTURE)
101                 },
102                 onRecentAppsTutorialClicked = {
103                     lastSelectedScreen = RECENT_APPS_GESTURE
104                     vm.goTo(RECENT_APPS_GESTURE)
105                 },
106                 onDoneButtonClicked = closeTutorial,
107                 lastSelectedScreen,
108             )
109         BACK_GESTURE ->
110             BackGestureTutorialScreen(
111                 onDoneButtonClicked = { vm.goTo(TUTORIAL_SELECTION) },
112                 onBack = { vm.goTo(TUTORIAL_SELECTION) },
113             )
114         HOME_GESTURE ->
115             HomeGestureTutorialScreen(
116                 onDoneButtonClicked = { vm.goTo(TUTORIAL_SELECTION) },
117                 onBack = { vm.goTo(TUTORIAL_SELECTION) },
118             )
119         RECENT_APPS_GESTURE ->
120             RecentAppsGestureTutorialScreen(
121                 onDoneButtonClicked = { vm.goTo(TUTORIAL_SELECTION) },
122                 onBack = { vm.goTo(TUTORIAL_SELECTION) },
123             )
124     }
125 }
126