Loading packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt +2 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import com.android.settingslib.spa.gallery.itemList.ItemListPageProvider import com.android.settingslib.spa.gallery.itemList.ItemOperatePageProvider import com.android.settingslib.spa.gallery.itemList.OperateListPageProvider import com.android.settingslib.spa.gallery.editor.SettingsOutlinedTextFieldPageProvider import com.android.settingslib.spa.gallery.editor.SettingsTextFieldPasswordPageProvider import com.android.settingslib.spa.gallery.page.ArgumentPageProvider import com.android.settingslib.spa.gallery.page.FooterPageProvider import com.android.settingslib.spa.gallery.page.IllustrationPageProvider Loading Loading @@ -92,6 +93,7 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) { SettingsOutlinedTextFieldPageProvider, SettingsExposedDropdownMenuBoxPageProvider, SettingsExposedDropdownMenuCheckBoxProvider, SettingsTextFieldPasswordPageProvider, ), rootPages = listOf( HomePageProvider.createSettingsPage(), Loading packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/EditorMainPageProvider.kt +2 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,8 @@ object EditorMainPageProvider : SettingsPageProvider { .build(), SettingsExposedDropdownMenuCheckBoxProvider.buildInjectEntry().setLink(fromPage = owner) .build(), SettingsTextFieldPasswordPageProvider.buildInjectEntry().setLink(fromPage = owner) .build(), ) } Loading packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsTextFieldPasswordPageProvider.kt 0 → 100644 +73 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 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.settingslib.spa.gallery.editor import android.os.Bundle import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.tooling.preview.Preview import com.android.settingslib.spa.framework.common.SettingsEntryBuilder import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.widget.editor.SettingsTextFieldPassword import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold private const val TITLE = "Sample SettingsTextFieldPassword" object SettingsTextFieldPasswordPageProvider : SettingsPageProvider { override val name = "SettingsTextFieldPassword" override fun getTitle(arguments: Bundle?): String { return TITLE } @Composable override fun Page(arguments: Bundle?) { var value by remember { mutableStateOf("value") } RegularScaffold(title = TITLE) { SettingsTextFieldPassword( value = value, label = "label", onTextChange = { value = it }) } } fun buildInjectEntry(): SettingsEntryBuilder { return SettingsEntryBuilder.createInject(owner = createSettingsPage()) .setUiLayoutFn { Preference(object : PreferenceModel { override val title = TITLE override val onClick = navigator(name) }) } } } @Preview(showBackground = true) @Composable private fun SettingsTextFieldPasswordPagePreview() { SettingsTheme { SettingsTextFieldPasswordPageProvider.Page(null) } } No newline at end of file packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsExposedDropdownMenuCheckBox.kt +2 −1 Original line number Diff line number Diff line Loading @@ -131,7 +131,8 @@ private fun ActionButtonsPreview() { val options = listOf("item1", "item2", "item3") val selectedOptionsState = remember { mutableStateListOf("item1", "item2") } SettingsTheme { SettingsExposedDropdownMenuCheckBox(label = "label", SettingsExposedDropdownMenuCheckBox( label = "label", options = options, selectedOptionsState = selectedOptionsState, enabled = true, Loading packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsTextFieldPassword.kt 0 → 100644 +92 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 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.settingslib.spa.widget.editor import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.selection.toggleable import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Visibility import androidx.compose.material.icons.outlined.VisibilityOff import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.theme.SettingsTheme @Composable fun SettingsTextFieldPassword( value: String, label: String, onTextChange: (String) -> Unit, ) { var visibility by remember { mutableStateOf(false) } OutlinedTextField( modifier = Modifier .padding(SettingsDimension.itemPadding) .fillMaxWidth(), value = value, onValueChange = onTextChange, label = { Text(text = label) }, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Password, imeAction = ImeAction.Send ), trailingIcon = { Icon( imageVector = if (visibility) Icons.Outlined.VisibilityOff else Icons.Outlined.Visibility, contentDescription = "Visibility Icon", modifier = Modifier .testTag("Visibility Icon") .size(SettingsDimension.itemIconSize) .toggleable(visibility) { visibility = !visibility }, ) }, visualTransformation = if (visibility) VisualTransformation.None else PasswordVisualTransformation() ) } @Preview @Composable private fun SettingsTextFieldPasswordPreview() { var value by remember { mutableStateOf("value") } SettingsTheme { SettingsTextFieldPassword( value = value, label = "label", onTextChange = { value = it }, ) } } No newline at end of file Loading
packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/GallerySpaEnvironment.kt +2 −0 Original line number Diff line number Diff line Loading @@ -32,6 +32,7 @@ import com.android.settingslib.spa.gallery.itemList.ItemListPageProvider import com.android.settingslib.spa.gallery.itemList.ItemOperatePageProvider import com.android.settingslib.spa.gallery.itemList.OperateListPageProvider import com.android.settingslib.spa.gallery.editor.SettingsOutlinedTextFieldPageProvider import com.android.settingslib.spa.gallery.editor.SettingsTextFieldPasswordPageProvider import com.android.settingslib.spa.gallery.page.ArgumentPageProvider import com.android.settingslib.spa.gallery.page.FooterPageProvider import com.android.settingslib.spa.gallery.page.IllustrationPageProvider Loading Loading @@ -92,6 +93,7 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) { SettingsOutlinedTextFieldPageProvider, SettingsExposedDropdownMenuBoxPageProvider, SettingsExposedDropdownMenuCheckBoxProvider, SettingsTextFieldPasswordPageProvider, ), rootPages = listOf( HomePageProvider.createSettingsPage(), Loading
packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/EditorMainPageProvider.kt +2 −0 Original line number Diff line number Diff line Loading @@ -39,6 +39,8 @@ object EditorMainPageProvider : SettingsPageProvider { .build(), SettingsExposedDropdownMenuCheckBoxProvider.buildInjectEntry().setLink(fromPage = owner) .build(), SettingsTextFieldPasswordPageProvider.buildInjectEntry().setLink(fromPage = owner) .build(), ) } Loading
packages/SettingsLib/Spa/gallery/src/com/android/settingslib/spa/gallery/editor/SettingsTextFieldPasswordPageProvider.kt 0 → 100644 +73 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 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.settingslib.spa.gallery.editor import android.os.Bundle import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.tooling.preview.Preview import com.android.settingslib.spa.framework.common.SettingsEntryBuilder import com.android.settingslib.spa.framework.common.SettingsPageProvider import com.android.settingslib.spa.framework.common.createSettingsPage import com.android.settingslib.spa.framework.compose.navigator import com.android.settingslib.spa.framework.theme.SettingsTheme import com.android.settingslib.spa.widget.editor.SettingsTextFieldPassword import com.android.settingslib.spa.widget.preference.Preference import com.android.settingslib.spa.widget.preference.PreferenceModel import com.android.settingslib.spa.widget.scaffold.RegularScaffold private const val TITLE = "Sample SettingsTextFieldPassword" object SettingsTextFieldPasswordPageProvider : SettingsPageProvider { override val name = "SettingsTextFieldPassword" override fun getTitle(arguments: Bundle?): String { return TITLE } @Composable override fun Page(arguments: Bundle?) { var value by remember { mutableStateOf("value") } RegularScaffold(title = TITLE) { SettingsTextFieldPassword( value = value, label = "label", onTextChange = { value = it }) } } fun buildInjectEntry(): SettingsEntryBuilder { return SettingsEntryBuilder.createInject(owner = createSettingsPage()) .setUiLayoutFn { Preference(object : PreferenceModel { override val title = TITLE override val onClick = navigator(name) }) } } } @Preview(showBackground = true) @Composable private fun SettingsTextFieldPasswordPagePreview() { SettingsTheme { SettingsTextFieldPasswordPageProvider.Page(null) } } No newline at end of file
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsExposedDropdownMenuCheckBox.kt +2 −1 Original line number Diff line number Diff line Loading @@ -131,7 +131,8 @@ private fun ActionButtonsPreview() { val options = listOf("item1", "item2", "item3") val selectedOptionsState = remember { mutableStateListOf("item1", "item2") } SettingsTheme { SettingsExposedDropdownMenuCheckBox(label = "label", SettingsExposedDropdownMenuCheckBox( label = "label", options = options, selectedOptionsState = selectedOptionsState, enabled = true, Loading
packages/SettingsLib/Spa/spa/src/com/android/settingslib/spa/widget/editor/SettingsTextFieldPassword.kt 0 → 100644 +92 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 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.settingslib.spa.widget.editor import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.selection.toggleable import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.Visibility import androidx.compose.material.icons.outlined.VisibilityOff import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.tooling.preview.Preview import com.android.settingslib.spa.framework.theme.SettingsDimension import com.android.settingslib.spa.framework.theme.SettingsTheme @Composable fun SettingsTextFieldPassword( value: String, label: String, onTextChange: (String) -> Unit, ) { var visibility by remember { mutableStateOf(false) } OutlinedTextField( modifier = Modifier .padding(SettingsDimension.itemPadding) .fillMaxWidth(), value = value, onValueChange = onTextChange, label = { Text(text = label) }, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Password, imeAction = ImeAction.Send ), trailingIcon = { Icon( imageVector = if (visibility) Icons.Outlined.VisibilityOff else Icons.Outlined.Visibility, contentDescription = "Visibility Icon", modifier = Modifier .testTag("Visibility Icon") .size(SettingsDimension.itemIconSize) .toggleable(visibility) { visibility = !visibility }, ) }, visualTransformation = if (visibility) VisualTransformation.None else PasswordVisualTransformation() ) } @Preview @Composable private fun SettingsTextFieldPasswordPreview() { var value by remember { mutableStateOf("value") } SettingsTheme { SettingsTextFieldPassword( value = value, label = "label", onTextChange = { value = it }, ) } } No newline at end of file