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