diff options
5 files changed, 155 insertions, 40 deletions
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 0017db68f85b..d3569c623804 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -3538,6 +3538,15 @@ --> <string name="shortcut_helper_key_combinations_or_separator">or</string> + <!-- Label for button opening tutorial for back gesture on touchpad [CHAR LIMIT=NONE] --> + <string name="touchpad_tutorial_back_gesture_button">Back gesture</string> + <!-- Label for button opening tutorial for back gesture on touchpad [CHAR LIMIT=NONE] --> + <string name="touchpad_tutorial_home_gesture_button">Home gesture</string> + <!-- Label for button opening tutorial on using Action key from keyboard [CHAR LIMIT=NONE] --> + <string name="touchpad_tutorial_action_key_button">Action key</string> + <!-- Label for button finishing touchpad tutorial [CHAR LIMIT=NONE] --> + <string name="touchpad_tutorial_done_button">Done</string> + <!-- Content description for keyboard backlight brightness dialog [CHAR LIMIT=NONE] --> <string name="keyboard_backlight_dialog_title">Keyboard backlight</string> <!-- Content description for keyboard backlight brightness value [CHAR LIMIT=NONE] --> diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/TouchpadTutorialViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/TouchpadTutorialViewModel.kt index 7669524ee316..11740a8a4ecc 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/TouchpadTutorialViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/TouchpadTutorialViewModel.kt @@ -27,6 +27,10 @@ class TouchpadTutorialViewModel : ViewModel() { private val _screen = MutableStateFlow(Screen.TUTORIAL_SELECTION) val screen: StateFlow<Screen> = _screen + fun goTo(screen: Screen) { + _screen.value = screen + } + class Factory @Inject constructor() : ViewModelProvider.Factory { @Suppress("UNCHECKED_CAST") diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/TutorialSelectionViewModel.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/TutorialSelectionViewModel.kt deleted file mode 100644 index 1a8272d8e7e3..000000000000 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/TutorialSelectionViewModel.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2024 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.touchpad.tutorial.ui - -import androidx.lifecycle.ViewModel -import androidx.lifecycle.ViewModelProvider - -class TutorialSelectionViewModel : ViewModel() - -class TutorialSelectionViewModelFactory : ViewModelProvider.Factory { - - @Suppress("UNCHECKED_CAST") - override fun <T : ViewModel> create(modelClass: Class<T>): T { - return TutorialSelectionViewModel() as T - } -} diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt index 09dd909cd9a3..b7629c7160ee 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TouchpadTutorialActivity.kt @@ -19,6 +19,7 @@ package com.android.systemui.touchpad.tutorial.ui.view import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent +import androidx.activity.enableEdgeToEdge import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.lifecycle.Lifecycle.State.STARTED @@ -33,8 +34,6 @@ import com.android.systemui.touchpad.tutorial.ui.Screen.BACK_GESTURE import com.android.systemui.touchpad.tutorial.ui.Screen.HOME_GESTURE import com.android.systemui.touchpad.tutorial.ui.Screen.TUTORIAL_SELECTION import com.android.systemui.touchpad.tutorial.ui.TouchpadTutorialViewModel -import com.android.systemui.touchpad.tutorial.ui.TutorialSelectionViewModel -import com.android.systemui.touchpad.tutorial.ui.TutorialSelectionViewModelFactory import javax.inject.Inject class TouchpadTutorialActivity @@ -45,27 +44,31 @@ constructor( override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContent { PlatformTheme { TouchpadTutorialScreen(viewModelFactory) } } + enableEdgeToEdge() + setContent { + PlatformTheme { TouchpadTutorialScreen(viewModelFactory, closeTutorial = { finish() }) } + } } } @Composable -fun TouchpadTutorialScreen(viewModelFactory: ViewModelProvider.Factory) { +fun TouchpadTutorialScreen(viewModelFactory: ViewModelProvider.Factory, closeTutorial: () -> Unit) { val vm = viewModel<TouchpadTutorialViewModel>(factory = viewModelFactory) val activeScreen by vm.screen.collectAsStateWithLifecycle(STARTED) when (activeScreen) { - TUTORIAL_SELECTION -> TutorialSelectionScreen() + TUTORIAL_SELECTION -> + TutorialSelectionScreen( + onBackTutorialClicked = { vm.goTo(BACK_GESTURE) }, + onHomeTutorialClicked = { vm.goTo(HOME_GESTURE) }, + onActionKeyTutorialClicked = {}, + onDoneButtonClicked = closeTutorial + ) BACK_GESTURE -> BackGestureTutorialScreen() HOME_GESTURE -> HomeGestureTutorialScreen() } } @Composable -fun TutorialSelectionScreen() { - val vm = viewModel<TutorialSelectionViewModel>(factory = TutorialSelectionViewModelFactory()) -} - -@Composable fun BackGestureTutorialScreen() { val vm = viewModel<BackGestureTutorialViewModel>(factory = GestureViewModelFactory()) } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TutorialSelectionScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TutorialSelectionScreen.kt new file mode 100644 index 000000000000..532eb1b82197 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/view/TutorialSelectionScreen.kt @@ -0,0 +1,129 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.touchpad.tutorial.ui.view + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.android.systemui.res.R + +@Composable +fun TutorialSelectionScreen( + onBackTutorialClicked: () -> Unit, + onHomeTutorialClicked: () -> Unit, + onActionKeyTutorialClicked: () -> Unit, + onDoneButtonClicked: () -> Unit, +) { + Column( + verticalArrangement = Arrangement.Center, + modifier = + Modifier.background( + color = MaterialTheme.colorScheme.surfaceContainer, + ) + .fillMaxSize() + ) { + TutorialSelectionButtons( + onBackTutorialClicked = onBackTutorialClicked, + onHomeTutorialClicked = onHomeTutorialClicked, + onActionKeyTutorialClicked = onActionKeyTutorialClicked, + modifier = Modifier.padding(60.dp) + ) + DoneButton( + onDoneButtonClicked = onDoneButtonClicked, + modifier = Modifier.padding(horizontal = 60.dp) + ) + } +} + +@Composable +private fun TutorialSelectionButtons( + onBackTutorialClicked: () -> Unit, + onHomeTutorialClicked: () -> Unit, + onActionKeyTutorialClicked: () -> Unit, + modifier: Modifier = Modifier +) { + Row( + horizontalArrangement = Arrangement.spacedBy(20.dp), + verticalAlignment = Alignment.CenterVertically, + modifier = modifier + ) { + TutorialButton( + text = stringResource(R.string.touchpad_tutorial_back_gesture_button), + onClick = onBackTutorialClicked, + color = MaterialTheme.colorScheme.primary, + modifier = Modifier.weight(1f) + ) + TutorialButton( + text = stringResource(R.string.touchpad_tutorial_home_gesture_button), + onClick = onHomeTutorialClicked, + color = MaterialTheme.colorScheme.secondary, + modifier = Modifier.weight(1f) + ) + TutorialButton( + text = stringResource(R.string.touchpad_tutorial_action_key_button), + onClick = onActionKeyTutorialClicked, + color = MaterialTheme.colorScheme.tertiary, + modifier = Modifier.weight(1f) + ) + } +} + +@Composable +private fun TutorialButton( + text: String, + onClick: () -> Unit, + color: Color, + modifier: Modifier = Modifier +) { + Button( + onClick = onClick, + shape = RoundedCornerShape(16.dp), + colors = ButtonDefaults.buttonColors(containerColor = color), + modifier = modifier.aspectRatio(0.66f) + ) { + Text(text = text, style = MaterialTheme.typography.headlineLarge) + } +} + +@Composable +private fun DoneButton(onDoneButtonClicked: () -> Unit, modifier: Modifier = Modifier) { + Row( + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.CenterVertically, + modifier = modifier.fillMaxWidth() + ) { + Button(onClick = onDoneButtonClicked) { + Text(stringResource(R.string.touchpad_tutorial_done_button)) + } + } +} |