From 8fab99ef2f02c69799f96036a7341a0f434ad1bd Mon Sep 17 00:00:00 2001 From: Meghan Date: Tue, 28 Jan 2025 16:21:06 -0500 Subject: [PATCH 01/14] Adding Autofill snippets Adding Autofill snippets --- .../compose/snippets/text/AutofillSnippets.kt | 122 ++++++++++++++++++ gradle/libs.versions.toml | 2 +- 2 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt new file mode 100644 index 00000000..ea63c040 --- /dev/null +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -0,0 +1,122 @@ +package com.example.compose.snippets.text + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.LocalAutofillHighlightColor +import androidx.compose.foundation.text.input.TextFieldState +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.autofill.ContentType +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalAutofillManager +import androidx.compose.ui.semantics.contentType +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.unit.dp +import com.example.compose.snippets.touchinput.Button + +@Composable +fun AddAutofill() { + // [START android_compose_autofill_1] + BasicTextField( + state = remember { TextFieldState("Enter your username.") }, + modifier = Modifier.semantics { contentType = ContentType.Username } + ) + // [END android_compose_autofill_1] +} + +@Composable +fun AddMultipleTypesOfAutofill() { + // [START android_compose_autofill_2] + Column { + BasicTextField( + state = remember { TextFieldState() }, + modifier = + Modifier.semantics { + contentType = ContentType.Username + ContentType.EmailAddress + }, + ) + } + // [END android_compose_autofill_2] +} + +@Composable +fun SaveDataWithAutofill() { + // [START android_compose_autofill_3] + // [START android_compose_autofill_4] + val autofillManager = LocalAutofillManager.current + // [END android_compose_autofill_3] + + Column { + BasicTextField( + state = remember { TextFieldState() }, + modifier = + Modifier.semantics { + contentType = ContentType.NewUsername + }, + ) + + Spacer(modifier = Modifier.height(16.dp)) + + BasicTextField( + state = remember { TextFieldState() }, + modifier = + Modifier.semantics { + contentType = ContentType.NewPassword + }, + ) + } + // [END android_compose_autofill_4] +} + +@Composable +fun SaveDataWithAutofillOnClick() { + // [START android_compose_autofill_5] + val autofillManager = LocalAutofillManager.current + Column { + BasicTextField( + state = remember { TextFieldState() }, + modifier = + Modifier.semantics { + contentType = ContentType.NewUsername + }, + ) + + Spacer(modifier = Modifier.height(16.dp)) + + BasicTextField( + state = remember { TextFieldState() }, + modifier = + Modifier.semantics { + contentType = ContentType.NewPassword + }, + ) + + // Submit button + Button(onClick = { autofillManager?.commit() }) { Text("Reset credentials") } + } + // [END android_compose_autofill_5] +} + +// [START android_compose_autofill_6] +@Composable +fun customizeAutofillHighlight() { + val customHighlightColor = Color.Red + val usernameState = remember { TextFieldState() } + + CompositionLocalProvider(LocalAutofillHighlightColor provides customHighlightColor) { + Column { + BasicTextField( + state = usernameState, + modifier = Modifier.semantics { + contentType = ContentType.Username + } + ) + } + } +} +// [END android_compose_autofill_6] \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 60263d02..e987a499 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -23,7 +23,7 @@ androidxHiltNavigationCompose = "1.2.0" coil = "2.7.0" # @keep compileSdk = "35" -compose-latest = "1.7.6" +compose-latest = "1.8.0-alpha08" composeUiTooling = "1.4.0" coreSplashscreen = "1.0.1" coroutines = "1.10.1" From b510be21337d67e7e4c72120cb3e3a1ba75a31bc Mon Sep 17 00:00:00 2001 From: MagicalMeghan <46006059+MagicalMeghan@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:23:29 +0000 Subject: [PATCH 02/14] Apply Spotless --- .../compose/snippets/text/AutofillSnippets.kt | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index ea63c040..d81cec05 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.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 androidx.compose.foundation.layout.Column @@ -119,4 +135,4 @@ fun customizeAutofillHighlight() { } } } -// [END android_compose_autofill_6] \ No newline at end of file +// [END android_compose_autofill_6] From 996e15e81ca52499dc88a4eb9c0be2bcb7360047 Mon Sep 17 00:00:00 2001 From: Meghan Date: Tue, 28 Jan 2025 16:51:03 -0500 Subject: [PATCH 03/14] Update shared element parameters --- .../AnimatedVisibilitySharedElementBlurSnippet.kt | 2 +- .../sharedelement/AnimatedVisibilitySharedElementSnippets.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/animations/sharedelement/AnimatedVisibilitySharedElementBlurSnippet.kt b/compose/snippets/src/main/java/com/example/compose/snippets/animations/sharedelement/AnimatedVisibilitySharedElementBlurSnippet.kt index 92bee909..e07cbec6 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/animations/sharedelement/AnimatedVisibilitySharedElementBlurSnippet.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/animations/sharedelement/AnimatedVisibilitySharedElementBlurSnippet.kt @@ -157,7 +157,7 @@ fun SharedTransitionScope.SnackItem( SnackContents( snack = snack, modifier = Modifier.sharedElement( - state = rememberSharedContentState(key = snack.name), + sharedContentState = rememberSharedContentState(key = snack.name), animatedVisibilityScope = this@AnimatedVisibility, boundsTransform = boundsTransition, ), diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/animations/sharedelement/AnimatedVisibilitySharedElementSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/animations/sharedelement/AnimatedVisibilitySharedElementSnippets.kt index 955dbe46..5a51b8d5 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/animations/sharedelement/AnimatedVisibilitySharedElementSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/animations/sharedelement/AnimatedVisibilitySharedElementSnippets.kt @@ -111,7 +111,7 @@ private fun AnimatedVisibilitySharedElementShortenedExample() { SnackContents( snack = snack, modifier = Modifier.sharedElement( - state = rememberSharedContentState(key = snack.name), + sharedContentState = rememberSharedContentState(key = snack.name), animatedVisibilityScope = this@AnimatedVisibility ), onClick = { @@ -175,7 +175,7 @@ fun SharedTransitionScope.SnackEditDetails( SnackContents( snack = targetSnack, modifier = Modifier.sharedElement( - state = rememberSharedContentState(key = targetSnack.name), + sharedContentState = rememberSharedContentState(key = targetSnack.name), animatedVisibilityScope = this@AnimatedContent, ), onClick = { From 3b9233ad2e97c43e4bce8a5a80b839bbd9f50380 Mon Sep 17 00:00:00 2001 From: Meghan Date: Tue, 28 Jan 2025 17:08:31 -0500 Subject: [PATCH 04/14] Update UserInteractions.kt --- .../touchinput/userinteractions/UserInteractions.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/userinteractions/UserInteractions.kt b/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/userinteractions/UserInteractions.kt index 07248a6f..44cbe60b 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/userinteractions/UserInteractions.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/userinteractions/UserInteractions.kt @@ -30,13 +30,14 @@ import androidx.compose.foundation.interaction.PressInteraction import androidx.compose.foundation.layout.Box import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.LocalRippleConfiguration -import androidx.compose.material.LocalUseFallbackRippleImplementation import androidx.compose.material.RippleConfiguration import androidx.compose.material.ripple import androidx.compose.material.ripple.LocalRippleTheme import androidx.compose.material.ripple.RippleAlpha import androidx.compose.material.ripple.RippleTheme import androidx.compose.material.ripple.rememberRipple +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.LocalUseFallbackRippleImplementation import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -239,7 +240,7 @@ private class ScaleIndicationNode( fun App() { } -@OptIn(ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) @Composable private fun LocalUseFallbackRippleImplementationExample() { // [START android_compose_userinteractions_localusefallbackrippleimplementation] @@ -252,7 +253,7 @@ private fun LocalUseFallbackRippleImplementationExample() { } // [START android_compose_userinteractions_localusefallbackrippleimplementation_app_theme] -@OptIn(ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) @Composable fun MyAppTheme(content: @Composable () -> Unit) { CompositionLocalProvider(LocalUseFallbackRippleImplementation provides true) { From 315d4f19a255c4ea0ce825942227795f075a4dc2 Mon Sep 17 00:00:00 2001 From: Meghan Date: Tue, 28 Jan 2025 17:47:36 -0500 Subject: [PATCH 05/14] Update AutofillSnippets.kt --- .../compose/snippets/text/AutofillSnippets.kt | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index d81cec05..035278b8 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -39,7 +39,7 @@ import com.example.compose.snippets.touchinput.Button fun AddAutofill() { // [START android_compose_autofill_1] BasicTextField( - state = remember { TextFieldState("Enter your username.") }, + state = remember { TextFieldState() }, modifier = Modifier.semantics { contentType = ContentType.Username } ) // [END android_compose_autofill_1] @@ -61,11 +61,16 @@ fun AddMultipleTypesOfAutofill() { } @Composable -fun SaveDataWithAutofill() { +fun AutofillManager() { // [START android_compose_autofill_3] - // [START android_compose_autofill_4] val autofillManager = LocalAutofillManager.current // [END android_compose_autofill_3] +} + +@Composable +fun SaveDataWithAutofill() { + // [START android_compose_autofill_4] + val autofillManager = LocalAutofillManager.current Column { BasicTextField( @@ -122,12 +127,11 @@ fun SaveDataWithAutofillOnClick() { @Composable fun customizeAutofillHighlight() { val customHighlightColor = Color.Red - val usernameState = remember { TextFieldState() } CompositionLocalProvider(LocalAutofillHighlightColor provides customHighlightColor) { Column { BasicTextField( - state = usernameState, + state = remember { TextFieldState() }, modifier = Modifier.semantics { contentType = ContentType.Username } From 4266212f5678d4c70cdb44212aa086e0d2b587f8 Mon Sep 17 00:00:00 2001 From: Meghan Date: Wed, 29 Jan 2025 12:41:49 -0500 Subject: [PATCH 06/14] Added Drag and Drop updates --- compose/snippets/build.gradle.kts | 3 ++ .../draganddrop/DragAndDropSnippets.kt | 40 +++++++------------ .../compose/snippets/text/AutofillSnippets.kt | 36 +++++++++++++++++ gradle/libs.versions.toml | 6 +++ 4 files changed, 60 insertions(+), 25 deletions(-) diff --git a/compose/snippets/build.gradle.kts b/compose/snippets/build.gradle.kts index 8b644b69..d901ea6e 100644 --- a/compose/snippets/build.gradle.kts +++ b/compose/snippets/build.gradle.kts @@ -77,6 +77,9 @@ android { dependencies { implementation(libs.androidx.work.runtime.ktx) + implementation(libs.testng) + implementation(libs.androidx.ui.test.android) + implementation(libs.androidx.ui.test.junit4.android) val composeBom = platform(libs.androidx.compose.bom) implementation(composeBom) androidTestImplementation(composeBom) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/draganddrop/DragAndDropSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/draganddrop/DragAndDropSnippets.kt index 46e245a3..5530e1c8 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/draganddrop/DragAndDropSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/draganddrop/DragAndDropSnippets.kt @@ -41,39 +41,29 @@ private fun DragAndDropSnippet() { val url = "" // [START android_compose_drag_and_drop_1] - Modifier.dragAndDropSource { - detectTapGestures(onLongPress = { - // Transfer data here. - }) + Modifier.dragAndDropSource { _ -> + // Transfer data here. + TODO() } // [END android_compose_drag_and_drop_1] // [START android_compose_drag_and_drop_2] - Modifier.dragAndDropSource { - detectTapGestures(onLongPress = { - startTransfer( - DragAndDropTransferData( - ClipData.newPlainText( - "image Url", url - ) - ) - ) - }) + Modifier.dragAndDropSource { _ -> + DragAndDropTransferData( + ClipData.newPlainText( + "image Url", url) + ) } // [END android_compose_drag_and_drop_2] // [START android_compose_drag_and_drop_3] - Modifier.dragAndDropSource { - detectTapGestures(onLongPress = { - startTransfer( - DragAndDropTransferData( - ClipData.newPlainText( - "image Url", url - ), - flags = View.DRAG_FLAG_GLOBAL - ) - ) - }) + Modifier.dragAndDropSource { _ -> + DragAndDropTransferData( + ClipData.newPlainText( + "image Url", url + ), + flags = View.DRAG_FLAG_GLOBAL + ) } // [END android_compose_drag_and_drop_3] diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index 035278b8..c567f23a 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -22,6 +22,8 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.LocalAutofillHighlightColor import androidx.compose.foundation.text.input.TextFieldState +import androidx.compose.material.TextField +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -30,10 +32,20 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.autofill.ContentType import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalAutofillManager +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.semantics.SemanticsProperties +import androidx.compose.ui.semantics.SemanticsProperties.TestTag import androidx.compose.ui.semantics.contentType import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.test.SemanticsMatcher +import androidx.compose.ui.test.assert +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.unit.dp import com.example.compose.snippets.touchinput.Button +import org.junit.Rule +import org.testng.annotations.Test + @Composable fun AddAutofill() { @@ -140,3 +152,27 @@ fun customizeAutofillHighlight() { } } // [END android_compose_autofill_6] + +@get:Rule +val rule = createComposeRule() +@Test +fun autofillHintTest(): Unit { + val autofillHintString = "test autofill string" + val TestTag = "semantics-test-tag" + +// rule.setContent { +// Surface { +// TextField( +// state = remember { TextFieldState() }, +// modifier = Modifier +// .testTag(TestTag) +// .semantics { contentType = autofillHintString } +// ) +// } +// } +// +// rule.onNodeWithTag(TestTag) +// .assert(SemanticsMatcher.expectValue( +// SemanticsProperties.ContentType, autofillHintString) +// ) +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e987a499..10257e62 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -61,6 +61,9 @@ wear = "1.3.0" wearComposeFoundation = "1.4.0" wearComposeMaterial = "1.4.0" wearToolingPreview = "1.0.0" +testng = "6.9.6" +uiTestAndroid = "1.7.6" +uiTestJunit4Android = "1.7.6" [libraries] accompanist-adaptive = { module = "com.google.accompanist:accompanist-adaptive", version.ref = "accompanist" } @@ -149,6 +152,9 @@ kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutine kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } play-services-wearable = { module = "com.google.android.gms:play-services-wearable", version.ref = "playServicesWearable" } +testng = { group = "org.testng", name = "testng", version.ref = "testng" } +androidx-ui-test-android = { group = "androidx.compose.ui", name = "ui-test-android", version.ref = "uiTestAndroid" } +androidx-ui-test-junit4-android = { group = "androidx.compose.ui", name = "ui-test-junit4-android", version.ref = "uiTestJunit4Android" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } From b50ebf535988ce84d58850b7db057669524e6bb9 Mon Sep 17 00:00:00 2001 From: MagicalMeghan <46006059+MagicalMeghan@users.noreply.github.com> Date: Wed, 29 Jan 2025 17:43:27 +0000 Subject: [PATCH 07/14] Apply Spotless --- .../snippets/draganddrop/DragAndDropSnippets.kt | 4 ++-- .../example/compose/snippets/text/AutofillSnippets.kt | 11 +---------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/draganddrop/DragAndDropSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/draganddrop/DragAndDropSnippets.kt index 5530e1c8..eaa4ad2c 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/draganddrop/DragAndDropSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/draganddrop/DragAndDropSnippets.kt @@ -24,7 +24,6 @@ import androidx.annotation.RequiresApi import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.draganddrop.dragAndDropSource import androidx.compose.foundation.draganddrop.dragAndDropTarget -import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier @@ -51,7 +50,8 @@ private fun DragAndDropSnippet() { Modifier.dragAndDropSource { _ -> DragAndDropTransferData( ClipData.newPlainText( - "image Url", url) + "image Url", url + ) ) } // [END android_compose_drag_and_drop_2] diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index c567f23a..794e5238 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -22,8 +22,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.LocalAutofillHighlightColor import androidx.compose.foundation.text.input.TextFieldState -import androidx.compose.material.TextField -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -32,21 +30,14 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.autofill.ContentType import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalAutofillManager -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.semantics.SemanticsProperties -import androidx.compose.ui.semantics.SemanticsProperties.TestTag import androidx.compose.ui.semantics.contentType import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.assert import androidx.compose.ui.test.junit4.createComposeRule -import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.unit.dp import com.example.compose.snippets.touchinput.Button import org.junit.Rule import org.testng.annotations.Test - @Composable fun AddAutofill() { // [START android_compose_autofill_1] @@ -156,7 +147,7 @@ fun customizeAutofillHighlight() { @get:Rule val rule = createComposeRule() @Test -fun autofillHintTest(): Unit { +fun autofillHintTest() { val autofillHintString = "test autofill string" val TestTag = "semantics-test-tag" From 6722af8341f5e9a736d6ba0540cdeeb74d1e20be Mon Sep 17 00:00:00 2001 From: Meghan Date: Wed, 29 Jan 2025 13:05:39 -0500 Subject: [PATCH 08/14] Clean up --- compose/snippets/build.gradle.kts | 3 -- .../compose/snippets/text/AutofillSnippets.kt | 35 ------------------- .../userinteractions/UserInteractions.kt | 4 +-- gradle/libs.versions.toml | 6 ---- 4 files changed, 2 insertions(+), 46 deletions(-) diff --git a/compose/snippets/build.gradle.kts b/compose/snippets/build.gradle.kts index d901ea6e..8b644b69 100644 --- a/compose/snippets/build.gradle.kts +++ b/compose/snippets/build.gradle.kts @@ -77,9 +77,6 @@ android { dependencies { implementation(libs.androidx.work.runtime.ktx) - implementation(libs.testng) - implementation(libs.androidx.ui.test.android) - implementation(libs.androidx.ui.test.junit4.android) val composeBom = platform(libs.androidx.compose.bom) implementation(composeBom) androidTestImplementation(composeBom) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index c567f23a..5223420e 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -22,8 +22,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.LocalAutofillHighlightColor import androidx.compose.foundation.text.input.TextFieldState -import androidx.compose.material.TextField -import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider @@ -32,19 +30,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.autofill.ContentType import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalAutofillManager -import androidx.compose.ui.platform.testTag -import androidx.compose.ui.semantics.SemanticsProperties -import androidx.compose.ui.semantics.SemanticsProperties.TestTag import androidx.compose.ui.semantics.contentType import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.test.SemanticsMatcher -import androidx.compose.ui.test.assert -import androidx.compose.ui.test.junit4.createComposeRule -import androidx.compose.ui.test.onNodeWithTag import androidx.compose.ui.unit.dp import com.example.compose.snippets.touchinput.Button -import org.junit.Rule -import org.testng.annotations.Test @Composable @@ -152,27 +141,3 @@ fun customizeAutofillHighlight() { } } // [END android_compose_autofill_6] - -@get:Rule -val rule = createComposeRule() -@Test -fun autofillHintTest(): Unit { - val autofillHintString = "test autofill string" - val TestTag = "semantics-test-tag" - -// rule.setContent { -// Surface { -// TextField( -// state = remember { TextFieldState() }, -// modifier = Modifier -// .testTag(TestTag) -// .semantics { contentType = autofillHintString } -// ) -// } -// } -// -// rule.onNodeWithTag(TestTag) -// .assert(SemanticsMatcher.expectValue( -// SemanticsProperties.ContentType, autofillHintString) -// ) -} diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/userinteractions/UserInteractions.kt b/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/userinteractions/UserInteractions.kt index 44cbe60b..12de9f92 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/userinteractions/UserInteractions.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/touchinput/userinteractions/UserInteractions.kt @@ -240,7 +240,7 @@ private class ScaleIndicationNode( fun App() { } -@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable private fun LocalUseFallbackRippleImplementationExample() { // [START android_compose_userinteractions_localusefallbackrippleimplementation] @@ -253,7 +253,7 @@ private fun LocalUseFallbackRippleImplementationExample() { } // [START android_compose_userinteractions_localusefallbackrippleimplementation_app_theme] -@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class) +@OptIn(ExperimentalMaterial3Api::class) @Composable fun MyAppTheme(content: @Composable () -> Unit) { CompositionLocalProvider(LocalUseFallbackRippleImplementation provides true) { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 10257e62..e987a499 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -61,9 +61,6 @@ wear = "1.3.0" wearComposeFoundation = "1.4.0" wearComposeMaterial = "1.4.0" wearToolingPreview = "1.0.0" -testng = "6.9.6" -uiTestAndroid = "1.7.6" -uiTestJunit4Android = "1.7.6" [libraries] accompanist-adaptive = { module = "com.google.accompanist:accompanist-adaptive", version.ref = "accompanist" } @@ -152,9 +149,6 @@ kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutine kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" } play-services-wearable = { module = "com.google.android.gms:play-services-wearable", version.ref = "playServicesWearable" } -testng = { group = "org.testng", name = "testng", version.ref = "testng" } -androidx-ui-test-android = { group = "androidx.compose.ui", name = "ui-test-android", version.ref = "uiTestAndroid" } -androidx-ui-test-junit4-android = { group = "androidx.compose.ui", name = "ui-test-junit4-android", version.ref = "uiTestJunit4Android" } [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } From 86ee57c45e34b74f3eb555cefb0cf9759a7e0546 Mon Sep 17 00:00:00 2001 From: MagicalMeghan <46006059+MagicalMeghan@users.noreply.github.com> Date: Wed, 29 Jan 2025 18:09:08 +0000 Subject: [PATCH 09/14] Apply Spotless --- .../java/com/example/compose/snippets/text/AutofillSnippets.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index 5223420e..035278b8 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -35,7 +35,6 @@ import androidx.compose.ui.semantics.semantics import androidx.compose.ui.unit.dp import com.example.compose.snippets.touchinput.Button - @Composable fun AddAutofill() { // [START android_compose_autofill_1] From 105645a078ee71169d9c93baa549e608ca72feaa Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 6 Feb 2025 13:05:24 -0800 Subject: [PATCH 10/14] Update AutofillSnippets.kt Updated to Material3 TextField --- .../compose/snippets/text/AutofillSnippets.kt | 72 ++++++++++++------- 1 file changed, 48 insertions(+), 24 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index 5223420e..baa4986a 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -19,12 +19,12 @@ package com.example.compose.snippets.text import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.height -import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.LocalAutofillHighlightColor -import androidx.compose.foundation.text.input.TextFieldState +import androidx.compose.material3.TextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.autofill.ContentType @@ -32,15 +32,20 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalAutofillManager import androidx.compose.ui.semantics.contentType import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import com.example.compose.snippets.touchinput.Button @Composable fun AddAutofill() { + var textFieldValue = remember { + mutableStateOf(TextFieldValue("")) + } // [START android_compose_autofill_1] - BasicTextField( - state = remember { TextFieldState() }, + TextField( + value = textFieldValue.value, + onValueChange = {textFieldValue.value = it}, modifier = Modifier.semantics { contentType = ContentType.Username } ) // [END android_compose_autofill_1] @@ -48,10 +53,14 @@ fun AddAutofill() { @Composable fun AddMultipleTypesOfAutofill() { + var textFieldValue = remember { + mutableStateOf(TextFieldValue("")) + } // [START android_compose_autofill_2] Column { - BasicTextField( - state = remember { TextFieldState() }, + TextField( + value = textFieldValue.value, + onValueChange = {textFieldValue.value = it}, modifier = Modifier.semantics { contentType = ContentType.Username + ContentType.EmailAddress @@ -70,12 +79,16 @@ fun AutofillManager() { @Composable fun SaveDataWithAutofill() { + var textFieldValue = remember { + mutableStateOf(TextFieldValue("")) + } // [START android_compose_autofill_4] val autofillManager = LocalAutofillManager.current Column { - BasicTextField( - state = remember { TextFieldState() }, + TextField( + value = textFieldValue.value, + onValueChange = {textFieldValue.value = it}, modifier = Modifier.semantics { contentType = ContentType.NewUsername @@ -84,8 +97,9 @@ fun SaveDataWithAutofill() { Spacer(modifier = Modifier.height(16.dp)) - BasicTextField( - state = remember { TextFieldState() }, + TextField( + value = textFieldValue.value, + onValueChange = {textFieldValue.value = it}, modifier = Modifier.semantics { contentType = ContentType.NewPassword @@ -97,11 +111,16 @@ fun SaveDataWithAutofill() { @Composable fun SaveDataWithAutofillOnClick() { + var textFieldValue = remember { + mutableStateOf(TextFieldValue("")) + } // [START android_compose_autofill_5] val autofillManager = LocalAutofillManager.current + Column { - BasicTextField( - state = remember { TextFieldState() }, + TextField( + value = textFieldValue.value, + onValueChange = {textFieldValue.value = it}, modifier = Modifier.semantics { contentType = ContentType.NewUsername @@ -110,8 +129,9 @@ fun SaveDataWithAutofillOnClick() { Spacer(modifier = Modifier.height(16.dp)) - BasicTextField( - state = remember { TextFieldState() }, + TextField( + value = textFieldValue.value, + onValueChange = {textFieldValue.value = it}, modifier = Modifier.semantics { contentType = ContentType.NewPassword @@ -126,18 +146,22 @@ fun SaveDataWithAutofillOnClick() { // [START android_compose_autofill_6] @Composable -fun customizeAutofillHighlight() { +fun CustomAutofillHighlight(customHighlightColor: Color = Color.Red) { + var textFieldValue = remember { + mutableStateOf(TextFieldValue("")) + } + // [START android_compose_autofill_6] val customHighlightColor = Color.Red - CompositionLocalProvider(LocalAutofillHighlightColor provides customHighlightColor) { - Column { - BasicTextField( - state = remember { TextFieldState() }, - modifier = Modifier.semantics { - contentType = ContentType.Username - } - ) - } + TextField( + value = textFieldValue.value, + onValueChange = {textFieldValue.value = it}, + modifier = Modifier.semantics { + contentType = ContentType.Username + } + ) } + // [END android_compose_autofill_6] } // [END android_compose_autofill_6] + From 635ea2c1030c88c6e4360d258c9e26d0c17709fb Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 6 Feb 2025 13:07:55 -0800 Subject: [PATCH 11/14] Update AutofillSnippets.kt Clean up snippet 6 --- .../java/com/example/compose/snippets/text/AutofillSnippets.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index 18e6f75b..a43599ba 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -143,7 +143,6 @@ fun SaveDataWithAutofillOnClick() { // [END android_compose_autofill_5] } -// [START android_compose_autofill_6] @Composable fun CustomAutofillHighlight(customHighlightColor: Color = Color.Red) { var textFieldValue = remember { @@ -162,5 +161,3 @@ fun CustomAutofillHighlight(customHighlightColor: Color = Color.Red) { } // [END android_compose_autofill_6] } -// [END android_compose_autofill_6] - From 8927d2dca080a37fdfd402f3ddf21bd067c9edf1 Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 6 Feb 2025 13:40:32 -0800 Subject: [PATCH 12/14] Update AutofillSnippets.kt clean up --- .../compose/snippets/text/AutofillSnippets.kt | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index a43599ba..1bd1e9dd 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -56,16 +56,13 @@ fun AddMultipleTypesOfAutofill() { mutableStateOf(TextFieldValue("")) } // [START android_compose_autofill_2] - Column { - TextField( - value = textFieldValue.value, - onValueChange = {textFieldValue.value = it}, - modifier = - Modifier.semantics { - contentType = ContentType.Username + ContentType.EmailAddress - }, - ) - } + TextField( + value = textFieldValue.value, + onValueChange = { textFieldValue.value = it }, + modifier = Modifier.semantics { + contentType = ContentType.Username + ContentType.EmailAddress + } + ) // [END android_compose_autofill_2] } @@ -87,22 +84,16 @@ fun SaveDataWithAutofill() { Column { TextField( value = textFieldValue.value, - onValueChange = {textFieldValue.value = it}, - modifier = - Modifier.semantics { - contentType = ContentType.NewUsername - }, + onValueChange = { textFieldValue.value = it }, + modifier = Modifier.semantics { contentType = ContentType.NewUsername } ) Spacer(modifier = Modifier.height(16.dp)) TextField( value = textFieldValue.value, - onValueChange = {textFieldValue.value = it}, - modifier = - Modifier.semantics { - contentType = ContentType.NewPassword - }, + onValueChange = { textFieldValue.value = it }, + modifier = Modifier.semantics { contentType = ContentType.NewPassword } ) } // [END android_compose_autofill_4] @@ -119,7 +110,7 @@ fun SaveDataWithAutofillOnClick() { Column { TextField( value = textFieldValue.value, - onValueChange = {textFieldValue.value = it}, + onValueChange = { textFieldValue.value = it }, modifier = Modifier.semantics { contentType = ContentType.NewUsername @@ -130,7 +121,7 @@ fun SaveDataWithAutofillOnClick() { TextField( value = textFieldValue.value, - onValueChange = {textFieldValue.value = it}, + onValueChange = { textFieldValue.value = it }, modifier = Modifier.semantics { contentType = ContentType.NewPassword @@ -150,10 +141,11 @@ fun CustomAutofillHighlight(customHighlightColor: Color = Color.Red) { } // [START android_compose_autofill_6] val customHighlightColor = Color.Red + CompositionLocalProvider(LocalAutofillHighlightColor provides customHighlightColor) { TextField( value = textFieldValue.value, - onValueChange = {textFieldValue.value = it}, + onValueChange = { textFieldValue.value = it }, modifier = Modifier.semantics { contentType = ContentType.Username } From 77bd621bddc097b28da16d66e024e32e771dcacc Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 6 Feb 2025 13:55:49 -0800 Subject: [PATCH 13/14] Update AutofillSnippets.kt spacing --- .../compose/snippets/text/AutofillSnippets.kt | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index 1bd1e9dd..3b3c7984 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -112,9 +112,7 @@ fun SaveDataWithAutofillOnClick() { value = textFieldValue.value, onValueChange = { textFieldValue.value = it }, modifier = - Modifier.semantics { - contentType = ContentType.NewUsername - }, + Modifier.semantics { contentType = ContentType.NewUsername }, ) Spacer(modifier = Modifier.height(16.dp)) @@ -123,9 +121,7 @@ fun SaveDataWithAutofillOnClick() { value = textFieldValue.value, onValueChange = { textFieldValue.value = it }, modifier = - Modifier.semantics { - contentType = ContentType.NewPassword - }, + Modifier.semantics { contentType = ContentType.NewPassword }, ) // Submit button @@ -146,9 +142,7 @@ fun CustomAutofillHighlight(customHighlightColor: Color = Color.Red) { TextField( value = textFieldValue.value, onValueChange = { textFieldValue.value = it }, - modifier = Modifier.semantics { - contentType = ContentType.Username - } + modifier = Modifier.semantics { contentType = ContentType.Username } ) } // [END android_compose_autofill_6] From cfeb99f00017b6166c7c2467b050ba58dd6d9cca Mon Sep 17 00:00:00 2001 From: Meghan Date: Thu, 6 Feb 2025 13:56:34 -0800 Subject: [PATCH 14/14] Update AutofillSnippets.kt spacing --- .../com/example/compose/snippets/text/AutofillSnippets.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt index 3b3c7984..acb4e608 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/text/AutofillSnippets.kt @@ -111,8 +111,7 @@ fun SaveDataWithAutofillOnClick() { TextField( value = textFieldValue.value, onValueChange = { textFieldValue.value = it }, - modifier = - Modifier.semantics { contentType = ContentType.NewUsername }, + modifier = Modifier.semantics { contentType = ContentType.NewUsername }, ) Spacer(modifier = Modifier.height(16.dp)) @@ -120,8 +119,7 @@ fun SaveDataWithAutofillOnClick() { TextField( value = textFieldValue.value, onValueChange = { textFieldValue.value = it }, - modifier = - Modifier.semantics { contentType = ContentType.NewPassword }, + modifier = Modifier.semantics { contentType = ContentType.NewPassword }, ) // Submit button