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