Fixed
Status Update
Comments
cl...@google.com <cl...@google.com>
ap...@google.com <ap...@google.com> #2
Project: platform/frameworks/support
Branch: androidx-main
commit ed2450ec5d2cdf62f1ebf13a29fe04295ad65e44
Author: Anastasia Soboleva <soboleva@google.com>
Date: Thu Dec 30 19:22:41 2021
Add material decoration box for TextField and OutlinedTextField
It allows additionally to what is customisable in text fields already to customise paddings (incl. for dense text field support), border or indicator line.
In the future we could add prefix/suffix, helper message slots.
Fixes: 203764564
Fixes: 191543915
Fixes: 189971673
Fixes: 183136600
Fixes: 179882597
Fixes: 168003617
Test: TextFieldTest and OutlinedTextFieldTest
Test: new tests TextFieldDecorationBoxTest
Relnote: "Added TextFieldDecorationBox and
OutlinedTextFieldDecorationBox. Using them together with BasicTextField
will help you build custom text field based on Material Design text
fields but with more options for customisation."
Relnote: "Provided a way to adjust horizontal and vertical paddings in text fields."
Change-Id: I8c9f168a687e337670c266e1eb3e985da6aebdc3
M compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextFieldSamples.kt
M compose/material/material/api/current.txt
M compose/material/material/api/restricted_current.txt
M compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
A compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldDecorationBoxTest.kt
M compose/material/material/api/public_plus_experimental_current.txt
A compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TextFieldDecorationBoxDemos.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
M compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialDemos.kt
M compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialTextField.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
https://android-review.googlesource.com/1934969
Branch: androidx-main
commit ed2450ec5d2cdf62f1ebf13a29fe04295ad65e44
Author: Anastasia Soboleva <soboleva@google.com>
Date: Thu Dec 30 19:22:41 2021
Add material decoration box for TextField and OutlinedTextField
It allows additionally to what is customisable in text fields already to customise paddings (incl. for dense text field support), border or indicator line.
In the future we could add prefix/suffix, helper message slots.
Fixes: 203764564
Fixes: 191543915
Fixes: 189971673
Fixes: 183136600
Fixes: 179882597
Fixes: 168003617
Test: TextFieldTest and OutlinedTextFieldTest
Test: new tests TextFieldDecorationBoxTest
Relnote: "Added TextFieldDecorationBox and
OutlinedTextFieldDecorationBox. Using them together with BasicTextField
will help you build custom text field based on Material Design text
fields but with more options for customisation."
Relnote: "Provided a way to adjust horizontal and vertical paddings in text fields."
Change-Id: I8c9f168a687e337670c266e1eb3e985da6aebdc3
M compose/material/material/samples/src/main/java/androidx/compose/material/samples/TextFieldSamples.kt
M compose/material/material/api/current.txt
M compose/material/material/api/restricted_current.txt
M compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
A compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldDecorationBoxTest.kt
M compose/material/material/api/public_plus_experimental_current.txt
A compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TextFieldDecorationBoxDemos.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldDefaults.kt
M compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialDemos.kt
M compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialTextField.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
M compose/material/material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
Description
Version of Gradle Plugin: 4.2.0-alpha01
Version of Gradle: 6.5-rc-1
Version of Java: 8
OS: Windows 10
Steps to Reproduce:
@Composable
fun content() {
VerticalScroller {
for (i in 0..10){
embeddedHorizontalScroll()
}
}
}
@Composable
fun embeddedHorizontalScroll() {
HorizontalScroller {
for(i in 0..10){
Text(text = i.toString())
}
}
}
Crashes with log:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.blackcube.moviessearcher, PID: 1096
java.lang.IllegalArgumentException: Key 1288834201 was already registered. Please call unregister before registering again
at androidx.ui.savedinstancestate.UiSavedStateRegistryImpl.registerProvider(UiSavedStateRegistry.kt:97)
at androidx.ui.savedinstancestate.ValueProvider.updateAndReturnValue(RememberSavedInstanceState.kt:101)
at androidx.ui.savedinstancestate.RememberSavedInstanceStateKt.rememberSavedInstanceState(RememberSavedInstanceState.kt:66)
at androidx.ui.foundation.ScrollerKt.ScrollerPosition(Scroller.kt:69)
at androidx.ui.foundation.ScrollerKt.HorizontalScroller(Scroller.kt:260)
at com.blackcube.moviessearcher.ui.GenresScreenKt.embeddedHorizontalScroll(GenresScreen.kt:56)
at com.blackcube.moviessearcher.ui.GenresScreenKt$content$1.invoke(GenresScreen.kt:49)
at com.blackcube.moviessearcher.ui.GenresScreenKt$content$1.invoke(Unknown Source:16)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:148)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.layout.ColumnKt$Column$1.invoke(Column.kt:74)
at androidx.ui.layout.ColumnKt$Column$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:122)
at androidx.ui.layout.RowColumnImplKt.RowColumnImpl(RowColumnImpl.kt:66)
at androidx.ui.layout.ColumnKt.Column(Column.kt:68)
at androidx.ui.foundation.ScrollerKt$VerticalScroller$1.invoke(Scroller.kt:231)
at androidx.ui.foundation.ScrollerKt$VerticalScroller$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:157)
at androidx.ui.foundation.ScrollerKt.ScrollerLayout(Scroller.kt:316)
at androidx.ui.foundation.ScrollerKt.access$ScrollerLayout(Unknown Source:0)
at androidx.ui.foundation.ScrollerKt$Scroller$2.invoke(Scroller.kt:296)
at androidx.ui.foundation.ScrollerKt$Scroller$2.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.PassThroughLayout(Layout.kt:214)
at androidx.ui.semantics.SemanticsKt.Semantics(Semantics.kt:46)
at androidx.ui.foundation.ScrollerKt.Scroller(Scroller.kt:283)
at androidx.ui.foundation.ScrollerKt.VerticalScroller(Scroller.kt:230)
at com.blackcube.moviessearcher.ui.GenresScreenKt.content(GenresScreen.kt:47)
at com.blackcube.moviessearcher.ui.GenresScreenKt.GenresScreen(GenresScreen.kt:41)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appContent$1$1.invoke(UiMoviesApp.kt:21)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appContent$1$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.material.SurfaceKt$Surface$1.invoke(Surface.kt:101)
at androidx.ui.material.SurfaceKt$Surface$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:157)
at androidx.ui.material.SurfaceKt.SurfaceLayout(Surface.kt:123)
at androidx.ui.material.SurfaceKt.Surface-maZXub8(Surface.kt:91)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appContent$1.invoke(UiMoviesApp.kt:19)
E/AndroidRuntime: at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appContent$1.invoke(Unknown Source:16)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:148)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.animation.CrossfadeKt$Crossfade$2$1$1.invoke(Crossfade.kt:81)
at androidx.ui.animation.CrossfadeKt$Crossfade$2$1$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.animation.CrossfadeKt$Crossfade$1$1$1.invoke(Crossfade.kt:71)
at androidx.ui.animation.CrossfadeKt$Crossfade$1$1$1.invoke(Unknown Source:16)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:148)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.layout.StackKt$Stack$stackChildren$1.invoke(Stack.kt:50)
at androidx.ui.layout.StackKt$Stack$stackChildren$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:157)
at androidx.ui.layout.StackKt.Stack(Stack.kt:52)
at androidx.ui.animation.CrossfadeKt$Crossfade$1$1.invoke(Crossfade.kt:70)
at androidx.ui.animation.CrossfadeKt$Crossfade$1$1.invoke(Unknown Source:16)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:148)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.animation.CrossfadeKt$Crossfade$2.invoke(Crossfade.kt:80)
at androidx.ui.animation.CrossfadeKt$Crossfade$2.invoke(Unknown Source:16)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:148)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.layout.StackKt$Stack$stackChildren$1.invoke(Stack.kt:50)
at androidx.ui.layout.StackKt$Stack$stackChildren$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:157)
at androidx.ui.layout.StackKt.Stack(Stack.kt:52)
at androidx.ui.animation.CrossfadeKt.Crossfade(Crossfade.kt:76)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt.appContent(UiMoviesApp.kt:18)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$UIMoviesApp$1.invoke(UiMoviesApp.kt:12)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$UIMoviesApp$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appTheme$1.invoke(UiMoviesApp.kt:32)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt$appTheme$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.foundation.TextKt.ProvideTextStyle(Text.kt:231)
at androidx.ui.material.MaterialThemeKt$MaterialTheme$1$1.invoke(MaterialTheme.kt:66)
at androidx.ui.material.MaterialThemeKt$MaterialTheme$1$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.material.MaterialThemeKt$MaterialTheme$1.invoke(MaterialTheme.kt:61)
at androidx.ui.material.MaterialThemeKt$MaterialTheme$1.invoke(Unknown Source:14)
E/AndroidRuntime: at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.material.ColorKt.ProvideColorPalette(Color.kt:307)
at androidx.ui.material.MaterialThemeKt.MaterialTheme(MaterialTheme.kt:59)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt.appTheme(UiMoviesApp.kt:31)
at com.blackcube.moviessearcher.ui.UiMoviesAppKt.UIMoviesApp(UiMoviesApp.kt:11)
at com.blackcube.moviessearcher.ui.MainActivity$onCreate$1.invoke(MainActivity.kt:14)
at com.blackcube.moviessearcher.ui.MainActivity$onCreate$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.selection.SelectionContainerKt$SelectionContainer$3$1.invoke(SelectionContainer.kt:100)
at androidx.ui.core.selection.SelectionContainerKt$SelectionContainer$3$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:167)
at androidx.ui.core.LayoutKt.Layout(Layout.kt:157)
at androidx.ui.core.selection.SelectionContainerKt.Wrap(SelectionContainer.kt:156)
at androidx.ui.core.selection.SelectionContainerKt.access$Wrap(Unknown Source:0)
at androidx.ui.core.selection.SelectionContainerKt$SelectionContainer$3.invoke(SelectionContainer.kt:99)
at androidx.ui.core.selection.SelectionContainerKt$SelectionContainer$3.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.core.selection.SelectionContainerKt.SelectionContainer(SelectionContainer.kt:96)
at androidx.ui.core.selection.SelectionContainerKt.SelectionContainer(SelectionContainer.kt:55)
at androidx.ui.core.WrapperKt.WrapWithSelectionContainer(Wrapper.kt:168)
at androidx.ui.core.WrapperKt.access$WrapWithSelectionContainer(Unknown Source:0)
at androidx.ui.core.WrappedComposition$setContent$1$1.invoke(Wrapper.kt:248)
at androidx.ui.core.WrappedComposition$setContent$1$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.AmbientKt.Providers(Ambient.kt:169)
at androidx.ui.core.WrapperKt.WrapWithAmbients(Wrapper.kt:325)
at androidx.ui.core.WrapperKt.access$WrapWithAmbients(Unknown Source:0)
at androidx.ui.core.WrappedComposition$setContent$1.invoke(Wrapper.kt:247)
at androidx.ui.core.WrappedComposition$setContent$1.invoke(Unknown Source:14)
at androidx.compose.internal.RestartableFunction.invoke(RestartableFunction.kt:139)
at androidx.compose.internal.RestartableFunction.invoke(Unknown Source:14)
at androidx.compose.ComposerKt.invokeComposable(Composer.kt:2302)
at androidx.compose.Recomposer.recompose$compose_runtime_release(Recomposer.kt:77)
at androidx.compose.CompositionImpl.setContent(Composition.kt:120)
at androidx.ui.core.WrappedComposition.setContent(Wrapper.kt:246)
at androidx.ui.core.WrappedComposition$setContent$2.invoke(Wrapper.kt:257)
at androidx.ui.core.WrappedComposition$setContent$2.invoke(Unknown Source:2)
at androidx.ui.core.SavedStateDelegate.stopWaitingForStateRestoration(SavedStateDelegate.kt:83)
at androidx.ui.core.AndroidComposeView.onMeasure(AndroidComposeView.kt:321)
at android.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
E/AndroidRuntime: at android.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
at android.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
at android.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:724)
at android.view.View.measure(View.java:22071)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2422)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1504)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1761)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
at android.view.Choreographer.doCallbacks(Choreographer.java:723)
at android.view.Choreographer.doFrame(Choreographer.java:658)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
I/zygote: Do partial code cache collection, code=29KB, data=28KB
I/zygote: After code cache collection, code=29KB, data=28KB
Increasing code cache capacity to 128KB
The reason is here as I understand:
@Composable
fun <T : Any> rememberSavedInstanceState(
vararg inputs: Any?,
saver: Saver<T, out Any> = autoSaver(),
key: String? = null,
init: () -> T
): T {
val finalKey = if (!key.isNullOrEmpty()) {
key
} else {
currentComposer.currentCompoundKeyHash.toString()
}
val registry = UiSavedStateRegistryAmbient.current
val valueProvider = remember(*inputs) { ValueProvider<T>() }
return valueProvider.updateAndReturnValue(registry, saver, finalKey, init)
}
currentComposer.currentCompoundKeyHash returns the same key for every embedded ScrollPosition
If I do not use for-loop then everithing is ok:
@Composable
fun content() {
VerticalScroller {
embeddedHorizontalScroll()
embeddedHorizontalScroll()
embeddedHorizontalScroll()
embeddedHorizontalScroll()
embeddedHorizontalScroll()
embeddedHorizontalScroll()
}
}