Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95658224 authored by Charlotte Lu's avatar Charlotte Lu
Browse files

Add SetingsTextFieldPassword.

Fix: 300866869
Test: Unit Test
Change-Id: Ic74551ad1f25305feeba3c0ec3e5e93d1d0d89ec
parent e956a2f6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
@@ -92,6 +93,7 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) {
                SettingsOutlinedTextFieldPageProvider,
                SettingsExposedDropdownMenuBoxPageProvider,
                SettingsExposedDropdownMenuCheckBoxProvider,
                SettingsTextFieldPasswordPageProvider,
            ),
            rootPages = listOf(
                HomePageProvider.createSettingsPage(),
+2 −0
Original line number Diff line number Diff line
@@ -39,6 +39,8 @@ object EditorMainPageProvider : SettingsPageProvider {
                .build(),
            SettingsExposedDropdownMenuCheckBoxProvider.buildInjectEntry().setLink(fromPage = owner)
                .build(),
            SettingsTextFieldPasswordPageProvider.buildInjectEntry().setLink(fromPage = owner)
                .build(),
        )
    }

+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
+2 −1
Original line number Diff line number Diff line
@@ -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,
+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