• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.SwitchAppsGestureTutorialScreen
41 import com.android.systemui.touchpad.tutorial.ui.composable.TutorialSelectionScreen
42 import com.android.systemui.touchpad.tutorial.ui.viewmodel.BackGestureScreenViewModel
43 import com.android.systemui.touchpad.tutorial.ui.viewmodel.EasterEggGestureViewModel
44 import com.android.systemui.touchpad.tutorial.ui.viewmodel.HomeGestureScreenViewModel
45 import com.android.systemui.touchpad.tutorial.ui.viewmodel.RecentAppsGestureScreenViewModel
46 import com.android.systemui.touchpad.tutorial.ui.viewmodel.Screen.BACK_GESTURE
47 import com.android.systemui.touchpad.tutorial.ui.viewmodel.Screen.HOME_GESTURE
48 import com.android.systemui.touchpad.tutorial.ui.viewmodel.Screen.RECENT_APPS_GESTURE
49 import com.android.systemui.touchpad.tutorial.ui.viewmodel.Screen.SWITCH_APPS_GESTURE
50 import com.android.systemui.touchpad.tutorial.ui.viewmodel.Screen.TUTORIAL_SELECTION
51 import com.android.systemui.touchpad.tutorial.ui.viewmodel.SwitchAppsGestureScreenViewModel
52 import com.android.systemui.touchpad.tutorial.ui.viewmodel.TouchpadTutorialViewModel
53 import javax.inject.Inject
54 
55 class TouchpadTutorialActivity
56 @Inject
57 constructor(
58     private val viewModelFactory: TouchpadTutorialViewModel.Factory,
59     private val logger: InputDeviceTutorialLogger,
60     private val metricsLogger: KeyboardTouchpadTutorialMetricsLogger,
61     private val backGestureViewModel: BackGestureScreenViewModel,
62     private val homeGestureViewModel: HomeGestureScreenViewModel,
63     private val recentAppsGestureViewModel: RecentAppsGestureScreenViewModel,
64     private val switchAppsGestureScreenViewModel: SwitchAppsGestureScreenViewModel,
65     private val easterEggGestureViewModel: EasterEggGestureViewModel,
66 ) : ComponentActivity() {
67 
68     private val tutorialViewModel by
<lambda>null69         viewModels<TouchpadTutorialViewModel>(factoryProducer = { viewModelFactory })
70 
onCreatenull71     override fun onCreate(savedInstanceState: Bundle?) {
72         super.onCreate(savedInstanceState)
73         enableEdgeToEdge()
74         setTitle(getString(R.string.launch_touchpad_tutorial_notification_content))
75         setContent {
76             PlatformTheme {
77                 TouchpadTutorialScreen(
78                     tutorialViewModel,
79                     backGestureViewModel,
80                     homeGestureViewModel,
81                     recentAppsGestureViewModel,
82                     switchAppsGestureScreenViewModel,
83                     easterEggGestureViewModel,
84                     closeTutorial = ::finishTutorial,
85                 )
86             }
87         }
88         // required to handle 3+ fingers on touchpad
89         window.addPrivateFlags(WindowManager.LayoutParams.PRIVATE_FLAG_TRUSTED_OVERLAY)
90         metricsLogger.logPeripheralTutorialLaunchedFromSettings()
91         logger.logOpenTutorial(TutorialContext.TOUCHPAD_TUTORIAL)
92     }
93 
finishTutorialnull94     private fun finishTutorial() {
95         logger.logCloseTutorial(TutorialContext.TOUCHPAD_TUTORIAL)
96         finish()
97     }
98 
onResumenull99     override fun onResume() {
100         super.onResume()
101         tutorialViewModel.onOpened()
102     }
103 
onPausenull104     override fun onPause() {
105         super.onPause()
106         tutorialViewModel.onClosed()
107     }
108 }
109 
110 @Composable
TouchpadTutorialScreennull111 fun TouchpadTutorialScreen(
112     vm: TouchpadTutorialViewModel,
113     backGestureViewModel: BackGestureScreenViewModel,
114     homeGestureViewModel: HomeGestureScreenViewModel,
115     recentAppsGestureViewModel: RecentAppsGestureScreenViewModel,
116     switchAppsGestureScreenViewModel: SwitchAppsGestureScreenViewModel,
117     easterEggGestureViewModel: EasterEggGestureViewModel,
118     closeTutorial: () -> Unit,
119 ) {
120     val activeScreen by vm.screen.collectAsStateWithLifecycle(STARTED)
121     var lastSelectedScreen by remember { mutableStateOf(TUTORIAL_SELECTION) }
122     when (activeScreen) {
123         TUTORIAL_SELECTION ->
124             TutorialSelectionScreen(
125                 onBackTutorialClicked = {
126                     lastSelectedScreen = BACK_GESTURE
127                     vm.goTo(BACK_GESTURE)
128                 },
129                 onHomeTutorialClicked = {
130                     lastSelectedScreen = HOME_GESTURE
131                     vm.goTo(HOME_GESTURE)
132                 },
133                 onRecentAppsTutorialClicked = {
134                     lastSelectedScreen = RECENT_APPS_GESTURE
135                     vm.goTo(RECENT_APPS_GESTURE)
136                 },
137                 onSwitchAppsTutorialClicked = {
138                     lastSelectedScreen = SWITCH_APPS_GESTURE
139                     vm.goTo(SWITCH_APPS_GESTURE)
140                 },
141                 onDoneButtonClicked = closeTutorial,
142                 lastSelectedScreen,
143             )
144         BACK_GESTURE ->
145             BackGestureTutorialScreen(
146                 backGestureViewModel,
147                 easterEggGestureViewModel,
148                 onDoneButtonClicked = { vm.goTo(TUTORIAL_SELECTION) },
149                 onBack = { vm.goTo(TUTORIAL_SELECTION) },
150             )
151         HOME_GESTURE ->
152             HomeGestureTutorialScreen(
153                 homeGestureViewModel,
154                 easterEggGestureViewModel,
155                 onDoneButtonClicked = { vm.goTo(TUTORIAL_SELECTION) },
156                 onBack = { vm.goTo(TUTORIAL_SELECTION) },
157             )
158         RECENT_APPS_GESTURE ->
159             RecentAppsGestureTutorialScreen(
160                 recentAppsGestureViewModel,
161                 easterEggGestureViewModel,
162                 onDoneButtonClicked = { vm.goTo(TUTORIAL_SELECTION) },
163                 onBack = { vm.goTo(TUTORIAL_SELECTION) },
164             )
165         SWITCH_APPS_GESTURE ->
166             SwitchAppsGestureTutorialScreen(
167                 switchAppsGestureScreenViewModel,
168                 easterEggGestureViewModel,
169                 onDoneButtonClicked = { vm.goTo(TUTORIAL_SELECTION) },
170                 onBack = { vm.goTo(TUTORIAL_SELECTION) },
171             )
172     }
173 }
174