From 45244fc61ea4e83055adcef29cb85e86f1f491e4 Mon Sep 17 00:00:00 2001 From: Meghan Date: Wed, 14 May 2025 15:47:06 -0400 Subject: [PATCH 1/9] State based TF snippets --- .../compose/snippets/text/StateBasedText.kt | 304 ++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt new file mode 100644 index 000000000..bce048f26 --- /dev/null +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt @@ -0,0 +1,304 @@ +package com.example.compose.snippets.text + +import android.text.TextUtils +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.foundation.text.input.InputTransformation +import androidx.compose.foundation.text.input.OutputTransformation +import androidx.compose.foundation.text.input.TextFieldBuffer +import androidx.compose.foundation.text.input.TextFieldLineLimits +import androidx.compose.foundation.text.input.TextFieldState +import androidx.compose.foundation.text.input.clearText +import androidx.compose.foundation.text.input.insert +import androidx.compose.foundation.text.input.maxLength +import androidx.compose.foundation.text.input.rememberTextFieldState +import androidx.compose.foundation.text.input.selectAll +import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd +import androidx.compose.foundation.text.input.then +import androidx.compose.material.SecureTextField +import androidx.compose.material.TextField + +import androidx.compose.material3.Button +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.Text +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.Modifier +import androidx.compose.ui.graphics.Brush +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.launch + +@Composable +fun StateBasedTextSnippets() { + // [START android_compose_state_text_1] + BasicTextField(state = rememberTextFieldState()) + + TextField(state = rememberTextFieldState()) + // [END android_compose_state_text_1] +} + +@Composable +fun StyleTextField() { + // [START android_compose_state_text_2] + TextField( + state = rememberTextFieldState(), + lineLimits = TextFieldLineLimits.MultiLine(maxHeightInLines = 2), + placeholder = { Text("") }, + textStyle = TextStyle(color = Color.Blue, fontWeight = FontWeight.Bold), + modifier = Modifier.padding(20.dp) + ) + // [END android_compose_state_text_2] +} + +@Composable +fun ConfigureLineLimits() { + // [START android_compose_state_text_3] + TextField( + state = rememberTextFieldState(), + lineLimits = TextFieldLineLimits.SingleLine + ) + // [END android_compose_state_text_3] + + // [START android_compose_state_text_4] + TextField( + state = rememberTextFieldState(), + lineLimits = TextFieldLineLimits.MultiLine(1, 4) + ) + // [END android_compose_state_text_4] +} + +@Composable +fun StyleWithBrush() { + // [START android_compose_state_text_5] + val brush = remember { + Brush.linearGradient( + colors = listOf(Color.Red, Color.Yellow, Color.Green, Color.Blue, Color.Magenta) + ) + } + TextField( + state = rememberTextFieldState(), textStyle = TextStyle(brush = brush) + ) + // [END android_compose_state_text_5] +} + +// [START android_compose_state_text_6] +// TODO fix this snippet +//val usernameState = rememberTextFieldState() +//TextField( +//state = usernameState, +//lineLimits = TextFieldLineLimits.SingleLine, +//placeholder = { Text("Enter Username") } +//) + val LoginRepository = "repository" + +class LoginViewModel(val loginRepository: Repository): ViewModel() { + val username = TextFieldState() + val password = TextFieldState() + + val isLoginButtonEnabled: Boolean + get() = !isLoginButtonLoading && username.text.length > 6 && password.text.length > 6 + + var isLoginButtonLoading by mutableStateOf(false) + private set + + fun loginButtonClick() { + viewModelScope.launch { + isLoginButtonLoading = true + val result = loginRepository.login( + username.text.toString(), + password.text.toString() + ) + // process result + isLoginButtonLoading = false + } + } +} + +@Composable +fun LoginForm( + viewModel: LoginViewModel, + modifier: Modifier +) { + Column(modifier) { + TextField(viewModel.username) + SecureTextField(viewModel.password) + Button( + onClick = viewModel::loginButtonClick, + enabled = viewModel.isLoginButtonEnabled + ) { + if (viewModel.isLoginButtonLoading) { + CircularProgressIndicator() + } else { + Text("Login") + } + } + } +} +// [END android_compose_state_text_6] + +class Repository { + fun login(username: String, password: String) { + + } +} + +@Composable +fun TextFieldPlaceholder() { + +} + +@Preview +@Composable +fun TextFieldInitialState() { + // [START android_compose_state_text_7] + TextField( + state = rememberTextFieldState(initialText = "Username"), + lineLimits = TextFieldLineLimits.SingleLine, + ) + // [END android_compose_state_text_7] +} + +@Composable +fun TextFieldBuffer() { + // [START android_compose_state_text_8] + // [END android_compose_state_text_8] + // [START android_compose_state_text_9] + // [END android_compose_state_text_9] +} + +@Preview +@Composable +fun EditTextFieldState() { + // [START android_compose_state_text_10] + val usernameState = rememberTextFieldState("I love Android") + // textFieldState.text : I love Android + // textFieldState.selection: TextRange(14, 14) + usernameState.edit { insert(14, "!") } + // textFieldState.text : I love Android! + // textFieldState.selection: TextRange(15, 15) + usernameState.edit { replace(7, 14, "Compose") } + // textFieldState.text : I love Compose! + // textFieldState.selection: TextRange(15, 15) + usernameState.edit { append("!!!") } + // textFieldState.text : I love Compose!!!! + // textFieldState.selection: TextRange(18, 18) + usernameState.edit { selectAll() } + // textFieldState.text : I love Compose!!!! + // textFieldState.selection: TextRange(0, 18) + // [END android_compose_state_text_10] + + // [END android_compose_state_text_11] + usernameState.setTextAndPlaceCursorAtEnd("I really love Android") + // textFieldState.text : I really love Android + // textFieldState.selection : TextRange(21, 21) + // [END android_compose_state_text_11] + + // [END android_compose_state_text_12] + usernameState.clearText() + // textFieldState.text : + // textFieldState.selection : TextRange(0, 0) + // [END android_compose_state_text_12] +} + +class TextFieldViewModel : ViewModel() { + fun validateUsername() { + + } +} +val textFieldViewModel = TextFieldViewModel() +@Composable +fun TextFieldKeyboardOptions() { + // [START android_compose_state_text_13] + BasicTextField( + state = rememberTextFieldState(), + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), + onKeyboardAction = { performDefaultAction -> + textFieldViewModel.validateUsername() + performDefaultAction() + } + ) + // [END android_compose_state_text_13] +} + + + +@Composable +fun TextFieldInputTransformation() { + // [START android_compose_state_text_14] + TextField( + state = rememberTextFieldState(), + lineLimits = TextFieldLineLimits.SingleLine, + inputTransformation = InputTransformation.maxLength(10) + ) + // [END android_compose_state_text_14] + + // [START android_compose_state_text_17] + TextField( + state = rememberTextFieldState(), + inputTransformation = InputTransformation.maxLength(6) + .then(CustomInputTransformation()), + ) + // [END android_compose_state_text_17] + +} + +// [START android_compose_state_text_15] +class CustomInputTransformation : InputTransformation { + override fun TextFieldBuffer.transformInput() { + + + } +} +// [END android_compose_state_text_15] + +// [START android_compose_state_text_16] +class DigitOnlyInputTransformation : InputTransformation { + override fun TextFieldBuffer.transformInput() { + if (!TextUtils.isDigitsOnly(asCharSequence())) { + revertAllChanges() + } + } +} +// [END android_compose_state_text_16] + +// [START android_compose_state_text_17] +class CustomOutputTransformation : OutputTransformation { + override fun TextFieldBuffer.transformOutput() { + + + } +} +// [END android_compose_state_text_17] + +// [START android_compose_state_text_18] +class PhoneNumberOutputTransformation : OutputTransformation { + override fun TextFieldBuffer.transformOutput() { + if (length > 0) insert(0, "(") + if (length > 4) insert(4, ")") + if (length > 8) insert(8, "-") + } +} +// [END android_compose_state_text_18] + + +@Composable +fun TextFieldOutputTransformation() { + // [START android_compose_state_text_19] + TextField( + state = rememberTextFieldState(), + outputTransformation = PhoneNumberOutputTransformation() + ) + // [END android_compose_state_text_19] +} \ No newline at end of file From f1d108ec7b45ffa5a1a2240c55d77f37bf71c9cf Mon Sep 17 00:00:00 2001 From: MagicalMeghan <46006059+MagicalMeghan@users.noreply.github.com> Date: Wed, 14 May 2025 19:49:23 +0000 Subject: [PATCH 2/9] Apply Spotless --- .../compose/snippets/text/StateBasedText.kt | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt index bce048f26..045a16f29 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt @@ -1,3 +1,19 @@ +/* + * Copyright 2025 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 + * + * https://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.example.compose.snippets.text import android.text.TextUtils @@ -19,7 +35,6 @@ import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd import androidx.compose.foundation.text.input.then import androidx.compose.material.SecureTextField import androidx.compose.material.TextField - import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Text @@ -95,15 +110,15 @@ fun StyleWithBrush() { // [START android_compose_state_text_6] // TODO fix this snippet -//val usernameState = rememberTextFieldState() -//TextField( -//state = usernameState, -//lineLimits = TextFieldLineLimits.SingleLine, -//placeholder = { Text("Enter Username") } -//) - val LoginRepository = "repository" - -class LoginViewModel(val loginRepository: Repository): ViewModel() { +// val usernameState = rememberTextFieldState() +// TextField( +// state = usernameState, +// lineLimits = TextFieldLineLimits.SingleLine, +// placeholder = { Text("Enter Username") } +// ) +val LoginRepository = "repository" + +class LoginViewModel(val loginRepository: Repository) : ViewModel() { val username = TextFieldState() val password = TextFieldState() @@ -150,13 +165,11 @@ fun LoginForm( class Repository { fun login(username: String, password: String) { - } } @Composable fun TextFieldPlaceholder() { - } @Preview @@ -214,7 +227,6 @@ fun EditTextFieldState() { class TextFieldViewModel : ViewModel() { fun validateUsername() { - } } val textFieldViewModel = TextFieldViewModel() @@ -232,8 +244,6 @@ fun TextFieldKeyboardOptions() { // [END android_compose_state_text_13] } - - @Composable fun TextFieldInputTransformation() { // [START android_compose_state_text_14] @@ -251,14 +261,11 @@ fun TextFieldInputTransformation() { .then(CustomInputTransformation()), ) // [END android_compose_state_text_17] - } // [START android_compose_state_text_15] class CustomInputTransformation : InputTransformation { override fun TextFieldBuffer.transformInput() { - - } } // [END android_compose_state_text_15] @@ -276,8 +283,6 @@ class DigitOnlyInputTransformation : InputTransformation { // [START android_compose_state_text_17] class CustomOutputTransformation : OutputTransformation { override fun TextFieldBuffer.transformOutput() { - - } } // [END android_compose_state_text_17] @@ -292,7 +297,6 @@ class PhoneNumberOutputTransformation : OutputTransformation { } // [END android_compose_state_text_18] - @Composable fun TextFieldOutputTransformation() { // [START android_compose_state_text_19] @@ -301,4 +305,4 @@ fun TextFieldOutputTransformation() { outputTransformation = PhoneNumberOutputTransformation() ) // [END android_compose_state_text_19] -} \ No newline at end of file +} From 21908c23c65d5d1f268742ca86d86651b979cb49 Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 15 May 2025 14:54:41 -0400 Subject: [PATCH 3/9] updates --- .../compose/snippets/text/StateBasedText.kt | 92 +++++++------------ 1 file changed, 35 insertions(+), 57 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt index bce048f26..b8e51a843 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt @@ -24,6 +24,7 @@ import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -93,60 +94,17 @@ fun StyleWithBrush() { // [END android_compose_state_text_5] } -// [START android_compose_state_text_6] -// TODO fix this snippet -//val usernameState = rememberTextFieldState() -//TextField( -//state = usernameState, -//lineLimits = TextFieldLineLimits.SingleLine, -//placeholder = { Text("Enter Username") } -//) - val LoginRepository = "repository" - -class LoginViewModel(val loginRepository: Repository): ViewModel() { - val username = TextFieldState() - val password = TextFieldState() - - val isLoginButtonEnabled: Boolean - get() = !isLoginButtonLoading && username.text.length > 6 && password.text.length > 6 - - var isLoginButtonLoading by mutableStateOf(false) - private set - - fun loginButtonClick() { - viewModelScope.launch { - isLoginButtonLoading = true - val result = loginRepository.login( - username.text.toString(), - password.text.toString() - ) - // process result - isLoginButtonLoading = false - } - } -} - @Composable -fun LoginForm( - viewModel: LoginViewModel, - modifier: Modifier -) { - Column(modifier) { - TextField(viewModel.username) - SecureTextField(viewModel.password) - Button( - onClick = viewModel::loginButtonClick, - enabled = viewModel.isLoginButtonEnabled - ) { - if (viewModel.isLoginButtonLoading) { - CircularProgressIndicator() - } else { - Text("Login") - } - } - } +fun StateHoisting() { + // [START android_compose_state_text_6] + val usernameState = rememberTextFieldState() + TextField( + state = usernameState, + lineLimits = TextFieldLineLimits.SingleLine, + placeholder = { Text("Enter Username") } + ) + // [END android_compose_state_text_6] } -// [END android_compose_state_text_6] class Repository { fun login(username: String, password: String) { @@ -159,7 +117,6 @@ fun TextFieldPlaceholder() { } -@Preview @Composable fun TextFieldInitialState() { // [START android_compose_state_text_7] @@ -173,9 +130,28 @@ fun TextFieldInitialState() { @Composable fun TextFieldBuffer() { // [START android_compose_state_text_8] + val phoneNumberState = rememberTextFieldState() + + LaunchedEffect(phoneNumberState) { + phoneNumberState.edit { // TextFieldBuffer scope + append("123456789") + } + } + + TextField( + state = phoneNumberState, + inputTransformation = InputTransformation { // TextFieldBuffer scope + if (TextUtils.isDigitsOnly(asCharSequence())) { + revertAllChanges() + } + }, + outputTransformation = OutputTransformation { + if (length > 0) insert(0, "(") + if (length > 4) insert(4, ")") + if (length > 8) insert(8, "-") + } + ) // [END android_compose_state_text_8] - // [START android_compose_state_text_9] - // [END android_compose_state_text_9] } @Preview @@ -213,16 +189,18 @@ fun EditTextFieldState() { } class TextFieldViewModel : ViewModel() { + val usernameState = TextFieldState() fun validateUsername() { } } val textFieldViewModel = TextFieldViewModel() + @Composable fun TextFieldKeyboardOptions() { // [START android_compose_state_text_13] - BasicTextField( - state = rememberTextFieldState(), + TextField( + state = textFieldViewModel.usernameState, keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next), onKeyboardAction = { performDefaultAction -> textFieldViewModel.validateUsername() From 38a31a2c2d62ccaba8dc4574f093d6dd33713c02 Mon Sep 17 00:00:00 2001 From: MagicalMeghan <46006059+MagicalMeghan@users.noreply.github.com> Date: Thu, 15 May 2025 18:58:05 +0000 Subject: [PATCH 4/9] Apply Spotless --- .../com/example/compose/snippets/text/StateBasedText.kt | 7 ------- 1 file changed, 7 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt index 16bbcd7eb..9f8e34151 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt @@ -17,7 +17,6 @@ package com.example.compose.snippets.text import android.text.TextUtils -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardOptions @@ -33,15 +32,11 @@ import androidx.compose.foundation.text.input.rememberTextFieldState import androidx.compose.foundation.text.input.selectAll import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd import androidx.compose.foundation.text.input.then -import androidx.compose.material.SecureTextField import androidx.compose.material.TextField -import androidx.compose.material3.Button -import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier @@ -53,8 +48,6 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import kotlinx.coroutines.launch @Composable fun StateBasedTextSnippets() { From c2c0ffe4c8d2dd0cd0018e4ede7775151d03b808 Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 15 May 2025 16:12:20 -0400 Subject: [PATCH 5/9] Update StateBasedText.kt --- .../java/com/example/compose/snippets/text/StateBasedText.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt index 9f8e34151..171aec4a1 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt @@ -181,13 +181,13 @@ fun EditTextFieldState() { // textFieldState.selection: TextRange(0, 18) // [END android_compose_state_text_10] - // [END android_compose_state_text_11] + // [START android_compose_state_text_11] usernameState.setTextAndPlaceCursorAtEnd("I really love Android") // textFieldState.text : I really love Android // textFieldState.selection : TextRange(21, 21) // [END android_compose_state_text_11] - // [END android_compose_state_text_12] + // [START android_compose_state_text_12] usernameState.clearText() // textFieldState.text : // textFieldState.selection : TextRange(0, 0) From 5e4f8a9263dcd2388e12d63b750527e73f77d186 Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 15 May 2025 16:55:14 -0400 Subject: [PATCH 6/9] Update StateBasedText.kt --- .../compose/snippets/text/StateBasedText.kt | 56 +++++++++---------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt index 171aec4a1..4928df6b3 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt @@ -48,6 +48,7 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.ViewModel +import androidx.core.text.isDigitsOnly @Composable fun StateBasedTextSnippets() { @@ -114,15 +115,6 @@ fun StateHoisting() { // [END android_compose_state_text_6] } -class Repository { - fun login(username: String, password: String) { - } -} - -@Composable -fun TextFieldPlaceholder() { -} - @Composable fun TextFieldInitialState() { // [START android_compose_state_text_7] @@ -147,7 +139,7 @@ fun TextFieldBuffer() { TextField( state = phoneNumberState, inputTransformation = InputTransformation { // TextFieldBuffer scope - if (TextUtils.isDigitsOnly(asCharSequence())) { + if (asCharSequence().isDigitsOnly()) { revertAllChanges() } }, @@ -163,7 +155,7 @@ fun TextFieldBuffer() { @Preview @Composable fun EditTextFieldState() { - // [START android_compose_state_text_10] + // [START android_compose_state_text_9] val usernameState = rememberTextFieldState("I love Android") // textFieldState.text : I love Android // textFieldState.selection: TextRange(14, 14) @@ -179,19 +171,19 @@ fun EditTextFieldState() { usernameState.edit { selectAll() } // textFieldState.text : I love Compose!!!! // textFieldState.selection: TextRange(0, 18) - // [END android_compose_state_text_10] + // [END android_compose_state_text_9] - // [START android_compose_state_text_11] + // [START android_compose_state_text_10] usernameState.setTextAndPlaceCursorAtEnd("I really love Android") // textFieldState.text : I really love Android // textFieldState.selection : TextRange(21, 21) - // [END android_compose_state_text_11] + // [END android_compose_state_text_10] - // [START android_compose_state_text_12] + // [START android_compose_state_text_11] usernameState.clearText() // textFieldState.text : // textFieldState.selection : TextRange(0, 0) - // [END android_compose_state_text_12] + // [END android_compose_state_text_11] } class TextFieldViewModel : ViewModel() { @@ -224,14 +216,6 @@ fun TextFieldInputTransformation() { inputTransformation = InputTransformation.maxLength(10) ) // [END android_compose_state_text_14] - - // [START android_compose_state_text_17] - TextField( - state = rememberTextFieldState(), - inputTransformation = InputTransformation.maxLength(6) - .then(CustomInputTransformation()), - ) - // [END android_compose_state_text_17] } // [START android_compose_state_text_15] @@ -251,14 +235,26 @@ class DigitOnlyInputTransformation : InputTransformation { } // [END android_compose_state_text_16] -// [START android_compose_state_text_17] +@Composable +fun ChainInputTransformation() { + // [START android_compose_state_text_17] + TextField( + state = rememberTextFieldState(), + inputTransformation = InputTransformation.maxLength(6) + .then(CustomInputTransformation()), + ) + // [END android_compose_state_text_17] +} + +// [START android_compose_state_text_18] class CustomOutputTransformation : OutputTransformation { override fun TextFieldBuffer.transformOutput() { + } } -// [END android_compose_state_text_17] +// [END android_compose_state_text_18] -// [START android_compose_state_text_18] +// [START android_compose_state_text_19] class PhoneNumberOutputTransformation : OutputTransformation { override fun TextFieldBuffer.transformOutput() { if (length > 0) insert(0, "(") @@ -266,14 +262,14 @@ class PhoneNumberOutputTransformation : OutputTransformation { if (length > 8) insert(8, "-") } } -// [END android_compose_state_text_18] +// [END android_compose_state_text_19] @Composable fun TextFieldOutputTransformation() { - // [START android_compose_state_text_19] + // [START android_compose_state_text_20] TextField( state = rememberTextFieldState(), outputTransformation = PhoneNumberOutputTransformation() ) - // [END android_compose_state_text_19] + // [END android_compose_state_text_20] } From e36ed9d99a9cbb11e37372bb8bba1d4dbd8a4db2 Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 15 May 2025 16:56:27 -0400 Subject: [PATCH 7/9] Update StateBasedText.kt --- .../java/com/example/compose/snippets/text/StateBasedText.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt index 4928df6b3..c78af63d0 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt @@ -32,13 +32,13 @@ import androidx.compose.foundation.text.input.rememberTextFieldState import androidx.compose.foundation.text.input.selectAll import androidx.compose.foundation.text.input.setTextAndPlaceCursorAtEnd import androidx.compose.foundation.text.input.then +//noinspection UsingMaterialAndMaterial3Libraries import androidx.compose.material.TextField +//noinspection UsingMaterialAndMaterial3Libraries import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color From c9795dd76dcc9e11bdcc05e3fb291fe6bea40e82 Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 15 May 2025 17:22:00 -0400 Subject: [PATCH 8/9] Update StateBasedText.kt --- .../java/com/example/compose/snippets/text/StateBasedText.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt index c78af63d0..ef19a7e93 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt @@ -47,8 +47,8 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.lifecycle.ViewModel import androidx.core.text.isDigitsOnly +import androidx.lifecycle.ViewModel @Composable fun StateBasedTextSnippets() { From ca68af04aeecad3c9f417b09e2c361a7f4160f16 Mon Sep 17 00:00:00 2001 From: MagicalMeghan <46006059+MagicalMeghan@users.noreply.github.com> Date: Thu, 15 May 2025 21:24:00 +0000 Subject: [PATCH 9/9] Apply Spotless --- .../java/com/example/compose/snippets/text/StateBasedText.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt index ef19a7e93..50375279c 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/StateBasedText.kt @@ -249,7 +249,6 @@ fun ChainInputTransformation() { // [START android_compose_state_text_18] class CustomOutputTransformation : OutputTransformation { override fun TextFieldBuffer.transformOutput() { - } } // [END android_compose_state_text_18]