Merge "Add a separate internal task executor pool to fix flaky tests." into androidx-master-dev
diff --git a/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityResultFragmentVersionDetector.kt b/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityResultFragmentVersionDetector.kt
index 582084e..99e8848 100644
--- a/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityResultFragmentVersionDetector.kt
+++ b/activity/activity-lint/src/main/java/androidx/activity/lint/ActivityResultFragmentVersionDetector.kt
@@ -60,7 +60,7 @@
)
}
- var location: Location? = null
+ var locations = ArrayList<Location>()
lateinit var expression: UCallExpression
private var checkedImplementationDependencies = false
@@ -76,7 +76,7 @@
return
}
expression = node
- location = context.getLocation(node)
+ locations.add(context.getLocation(node))
}
}
}
@@ -90,7 +90,7 @@
valueCookie: Any,
statementCookie: Any
) {
- if (location == null) {
+ if (locations.isEmpty()) {
return
}
if (property == "api") {
@@ -195,8 +195,10 @@
if (library.isNotEmpty() &&
library.substringAfter("androidx.fragment:fragment:") < FRAGMENT_VERSION) {
- context.report(ISSUE, expression, location!!,
- "Upgrade Fragment version to at least $FRAGMENT_VERSION.")
+ locations.forEach { location ->
+ context.report(ISSUE, expression, location,
+ "Upgrade Fragment version to at least $FRAGMENT_VERSION.")
+ }
}
}
diff --git a/activity/activity-lint/src/test/java/androidx/activity/lint/ActivityResultFragmentVersionDetectorTest.kt b/activity/activity-lint/src/test/java/androidx/activity/lint/ActivityResultFragmentVersionDetectorTest.kt
index 5726acc..b47349c 100644
--- a/activity/activity-lint/src/test/java/androidx/activity/lint/ActivityResultFragmentVersionDetectorTest.kt
+++ b/activity/activity-lint/src/test/java/androidx/activity/lint/ActivityResultFragmentVersionDetectorTest.kt
@@ -148,6 +148,47 @@
}
@Test
+ fun expectFailRegisterForActivityResultMultipleCalls() {
+ lint().files(
+ gradle(
+ """
+ dependencies {
+ api("androidx.fragment:fragment:1.3.0-alpha05")
+ }
+ """
+ ),
+ kotlin(
+ """
+ package com.example
+
+ import androidx.activity.result.ActivityResultCaller
+ import androidx.activity.result.contract.ActivityResultContract
+
+ val launcher1 = ActivityResultCaller().registerForActivityResult(ActivityResultContract())
+
+ lateinit var launcher2: ActivityResultLauncher
+
+ fun foo() {
+ launcher2 = ActivityResultCaller().registerForActivityResult(ActivityResultContract())
+ }
+ """
+ ).indented()
+ )
+ .run()
+ .expect(
+ """
+ src/main/kotlin/com/example/test.kt:6: Error: Upgrade Fragment version to at least 1.3.0-alpha08. [InvalidFragmentVersionForActivityResult]
+ val launcher1 = ActivityResultCaller().registerForActivityResult(ActivityResultContract())
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ src/main/kotlin/com/example/test.kt:11: Error: Upgrade Fragment version to at least 1.3.0-alpha08. [InvalidFragmentVersionForActivityResult]
+ launcher2 = ActivityResultCaller().registerForActivityResult(ActivityResultContract())
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ 2 errors, 0 warnings
+ """.trimIndent()
+ )
+ }
+
+ @Test
fun expectFailTransitiveDependency() {
val projectFragment = project(kotlin(
"""
diff --git a/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java b/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
index b629dd1..2a2ef45 100644
--- a/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
+++ b/biometric/biometric/src/main/java/androidx/biometric/BiometricFragment.java
@@ -109,20 +109,25 @@
private static final boolean DEBUG_FORCE_FINGERPRINT = false;
/**
- * A handler used to post delayed events and to execute framework code.
- */
- @VisibleForTesting Handler mHandler = new Handler(Looper.getMainLooper());
-
- /**
* An executor used by {@link android.hardware.biometrics.BiometricPrompt} to run framework
* code.
*/
- private final Executor mPromptExecutor = new Executor() {
+ private static class PromptExecutor implements Executor {
+ private final Handler mPromptHandler = new Handler(Looper.getMainLooper());
+
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ PromptExecutor() {}
+
@Override
public void execute(@NonNull Runnable runnable) {
- mHandler.post(runnable);
+ mPromptHandler.post(runnable);
}
- };
+ }
+
+ /**
+ * A handler used to post delayed events.
+ */
+ @VisibleForTesting Handler mHandler = new Handler(Looper.getMainLooper());
/**
* The view model for the ongoing authentication session.
@@ -365,9 +370,8 @@
*/
@RequiresApi(Build.VERSION_CODES.P)
private void showBiometricPromptForAuthentication() {
- final Context context = requireContext();
final android.hardware.biometrics.BiometricPrompt.Builder builder =
- Api28Impl.createPromptBuilder(context);
+ Api28Impl.createPromptBuilder(requireContext().getApplicationContext());
final CharSequence title = mViewModel.getTitle();
final CharSequence subtitle = mViewModel.getSubtitle();
@@ -410,20 +414,17 @@
Api28Impl.buildPrompt(builder);
final android.os.CancellationSignal cancellationSignal =
mViewModel.getCancellationSignalProvider().getBiometricCancellationSignal();
+ final Executor executor = new PromptExecutor();
final android.hardware.biometrics.BiometricPrompt.AuthenticationCallback callback =
mViewModel.getAuthenticationCallbackProvider().getBiometricCallback();
BiometricPrompt.CryptoObject crypto = mViewModel.getCryptoObject();
if (crypto == null) {
- Api28Impl.authenticate(biometricPrompt, cancellationSignal, mPromptExecutor, callback);
+ Api28Impl.authenticate(biometricPrompt, cancellationSignal, executor, callback);
} else {
android.hardware.biometrics.BiometricPrompt.CryptoObject wrappedCrypto =
Objects.requireNonNull(CryptoObjectUtils.wrapForBiometricPrompt(crypto));
Api28Impl.authenticate(
- biometricPrompt,
- wrappedCrypto,
- cancellationSignal,
- mPromptExecutor,
- callback);
+ biometricPrompt, wrappedCrypto, cancellationSignal, executor, callback);
}
}
diff --git a/biometric/biometric/src/main/java/androidx/biometric/BiometricViewModel.java b/biometric/biometric/src/main/java/androidx/biometric/BiometricViewModel.java
index f403a81..1b18262 100644
--- a/biometric/biometric/src/main/java/androidx/biometric/BiometricViewModel.java
+++ b/biometric/biometric/src/main/java/androidx/biometric/BiometricViewModel.java
@@ -27,6 +27,7 @@
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;
+import java.lang.ref.WeakReference;
import java.util.concurrent.Executor;
/**
@@ -41,6 +42,103 @@
@RestrictTo(RestrictTo.Scope.LIBRARY)
public class BiometricViewModel extends ViewModel {
/**
+ * The default executor provided when {@link #getClientExecutor()} is called before
+ * {@link #setClientExecutor(Executor)}.
+ */
+ private static class DefaultExecutor implements Executor {
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ DefaultExecutor() {}
+
+ @Override
+ public void execute(Runnable runnable) {
+ mHandler.post(runnable);
+ }
+ }
+
+ /**
+ * The authentication callback listener passed to {@link AuthenticationCallbackProvider} when
+ * {@link #getAuthenticationCallbackProvider()} is called.
+ */
+ private static final class CallbackListener extends AuthenticationCallbackProvider.Listener {
+ private final WeakReference<BiometricViewModel> mViewModelRef;
+
+ /**
+ * Creates a callback listener with a weak reference to the given view model.
+ *
+ * @param viewModel The view model instance to hold a weak reference to.
+ */
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ CallbackListener(BiometricViewModel viewModel) {
+ mViewModelRef = new WeakReference<>(viewModel);
+ }
+
+ @Override
+ void onSuccess(@NonNull BiometricPrompt.AuthenticationResult result) {
+ if (mViewModelRef.get() != null && mViewModelRef.get().isAwaitingResult()) {
+ // Try to infer the authentication type if unknown.
+ if (result.getAuthenticationType()
+ == BiometricPrompt.AUTHENTICATION_RESULT_TYPE_UNKNOWN) {
+ result = new BiometricPrompt.AuthenticationResult(
+ result.getCryptoObject(),
+ mViewModelRef.get().getInferredAuthenticationResultType());
+ }
+
+ mViewModelRef.get().setAuthenticationResult(result);
+ }
+ }
+
+ @Override
+ void onError(int errorCode, @Nullable CharSequence errorMessage) {
+ if (mViewModelRef.get() != null
+ && !mViewModelRef.get().isConfirmingDeviceCredential()
+ && mViewModelRef.get().isAwaitingResult()) {
+ mViewModelRef.get().setAuthenticationError(
+ new BiometricErrorData(errorCode, errorMessage));
+ }
+ }
+
+ @Override
+ void onHelp(@Nullable CharSequence helpMessage) {
+ if (mViewModelRef.get() != null) {
+ mViewModelRef.get().setAuthenticationHelpMessage(helpMessage);
+ }
+ }
+
+ @Override
+ void onFailure() {
+ if (mViewModelRef.get() != null && mViewModelRef.get().isAwaitingResult()) {
+ mViewModelRef.get().setAuthenticationFailurePending(true);
+ }
+ }
+ }
+
+ /**
+ * The dialog listener that is returned by {@link #getNegativeButtonListener()}.
+ */
+ private static class NegativeButtonListener implements DialogInterface.OnClickListener {
+ private final WeakReference<BiometricViewModel> mViewModelRef;
+
+ /**
+ * Creates a negative button listener with a weak reference to the given view model.
+ *
+ * @param viewModel The view model instance to hold a weak reference to.
+ */
+ @SuppressWarnings("WeakerAccess") /* synthetic access */
+ NegativeButtonListener(BiometricViewModel viewModel) {
+ mViewModelRef = new WeakReference<>(viewModel);
+ }
+
+ @Override
+ public void onClick(DialogInterface dialogInterface, int which) {
+ if (mViewModelRef.get() != null) {
+ mViewModelRef.get().setNegativeButtonPressPending(true);
+ }
+ }
+ }
+
+ /**
* The executor that will run authentication callback methods.
*
* <p>If unset, callbacks are invoked on the main thread with {@link Looper#getMainLooper()}.
@@ -159,16 +257,7 @@
@NonNull
Executor getClientExecutor() {
- if (mClientExecutor == null) {
- final Handler handler = new Handler(Looper.getMainLooper());
- mClientExecutor = new Executor() {
- @Override
- public void execute(@NonNull Runnable command) {
- handler.post(command);
- }
- };
- }
- return mClientExecutor;
+ return mClientExecutor != null ? mClientExecutor : new DefaultExecutor();
}
void setClientExecutor(@NonNull Executor clientExecutor) {
@@ -297,44 +386,8 @@
@NonNull
AuthenticationCallbackProvider getAuthenticationCallbackProvider() {
if (mAuthenticationCallbackProvider == null) {
- mAuthenticationCallbackProvider = new AuthenticationCallbackProvider(
- new AuthenticationCallbackProvider.Listener() {
- @Override
- void onSuccess(@NonNull BiometricPrompt.AuthenticationResult result) {
- if (isAwaitingResult()) {
- // Try to infer the authentication type if unknown.
- if (result.getAuthenticationType()
- == BiometricPrompt.AUTHENTICATION_RESULT_TYPE_UNKNOWN) {
- result = new BiometricPrompt.AuthenticationResult(
- result.getCryptoObject(),
- getInferredAuthenticationResultType());
- }
-
- setAuthenticationResult(result);
- }
- }
-
- @Override
- void onError(int errorCode, @Nullable CharSequence errorMessage) {
- if (!isConfirmingDeviceCredential() && isAwaitingResult()) {
- setAuthenticationError(
- new BiometricErrorData(errorCode, errorMessage));
- }
- }
-
- @Override
- void onHelp(@Nullable CharSequence helpMessage) {
- setAuthenticationHelpMessage(helpMessage);
- }
-
- @Override
- void onFailure() {
- if (isAwaitingResult()) {
- setAuthenticationFailurePending(true);
- }
- }
- }
- );
+ mAuthenticationCallbackProvider =
+ new AuthenticationCallbackProvider(new CallbackListener(this));
}
return mAuthenticationCallbackProvider;
}
@@ -350,12 +403,7 @@
@NonNull
DialogInterface.OnClickListener getNegativeButtonListener() {
if (mNegativeButtonListener == null) {
- mNegativeButtonListener = new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- setNegativeButtonPressPending(true);
- }
- };
+ mNegativeButtonListener = new NegativeButtonListener(this);
}
return mNegativeButtonListener;
}
@@ -540,20 +588,6 @@
}
/**
- * Ensures the value of a given mutable live data object is updated on the main thread.
- *
- * @param liveData The mutable live data object whose value should be updated.
- * @param value The new value to be set for the mutable live data object.
- */
- private static <T> void updateValue(MutableLiveData<T> liveData, T value) {
- if (Thread.currentThread() == Looper.getMainLooper().getThread()) {
- liveData.setValue(value);
- } else {
- liveData.postValue(value);
- }
- }
-
- /**
* Attempts to infer the type of authenticator that was used to authenticate the user.
*
* @return The inferred authentication type, or
@@ -569,4 +603,18 @@
}
return BiometricPrompt.AUTHENTICATION_RESULT_TYPE_UNKNOWN;
}
+
+ /**
+ * Ensures the value of a given mutable live data object is updated on the main thread.
+ *
+ * @param liveData The mutable live data object whose value should be updated.
+ * @param value The new value to be set for the mutable live data object.
+ */
+ private static <T> void updateValue(MutableLiveData<T> liveData, T value) {
+ if (Thread.currentThread() == Looper.getMainLooper().getThread()) {
+ liveData.setValue(value);
+ } else {
+ liveData.postValue(value);
+ }
+ }
}
diff --git a/biometric/integration-tests/testapp/build.gradle b/biometric/integration-tests/testapp/build.gradle
index e1e27e0..73b5721 100644
--- a/biometric/integration-tests/testapp/build.gradle
+++ b/biometric/integration-tests/testapp/build.gradle
@@ -28,22 +28,25 @@
applicationId "androidx.biometric.integration.testapp"
minSdkVersion 18
versionCode 1
+ testInstrumentationRunnerArgument "listener", "leakcanary.FailTestOnLeakRunListener"
}
sourceSets {
main.manifest.srcFile 'src/main/AndroidManifest.xml'
main.java.srcDirs = ['src/main/java']
- main.java.excludes = ['**/build/**']
main.java.includes = ['**/*.java']
+ main.java.excludes = ['**/build/**']
main.res.srcDirs = ['src/main/res']
}
buildTypes {
debug {
- testCoverageEnabled true
+ testCoverageEnabled false
}
release {
+ minifyEnabled true
+ shrinkResources true
}
}
}
@@ -52,6 +55,20 @@
implementation(project(":biometric:biometric"))
implementation("androidx.activity:activity-ktx:1.1.0")
implementation("androidx.core:core:1.2.0")
- implementation("androidx.fragment:fragment:1.2.5")
+ implementation("androidx.fragment:fragment-ktx:1.2.5")
implementation(KOTLIN_STDLIB)
+
+ debugImplementation(LEAKCANARY)
+
+ androidTestImplementation(ANDROIDX_TEST_CORE)
+ androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+ androidTestImplementation(ANDROIDX_TEST_RULES)
+ androidTestImplementation(ANDROIDX_TEST_RUNNER)
+ androidTestImplementation(ANDROIDX_TEST_UIAUTOMATOR)
+ androidTestImplementation(ESPRESSO_CORE)
+ androidTestImplementation(ESPRESSO_IDLING_RESOURCE)
+ androidTestImplementation(KOTLIN_STDLIB)
+ androidTestImplementation(LEAKCANARY)
+ androidTestImplementation(LEAKCANARY_INSTRUMENTATION)
+ androidTestImplementation(TRUTH)
}
diff --git a/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/BiometricPromptEnrolledTest.kt b/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/BiometricPromptEnrolledTest.kt
new file mode 100644
index 0000000..d41e7a1
--- /dev/null
+++ b/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/BiometricPromptEnrolledTest.kt
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2020 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 androidx.biometric.integration.testapp
+
+import android.content.Context
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.action.ViewActions.click
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.espresso.matcher.ViewMatchers.withText
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import org.hamcrest.Matchers.containsString
+import org.junit.After
+import org.junit.Assume.assumeFalse
+import org.junit.Assume.assumeTrue
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class BiometricPromptEnrolledTest {
+ @Suppress("DEPRECATION")
+ @get:Rule
+ val activityRule = androidx.test.rule.ActivityTestRule(BiometricTestActivity::class.java)
+
+ private lateinit var context: Context
+ private lateinit var device: UiDevice
+
+ @Before
+ fun setUp() {
+ context = ApplicationProvider.getApplicationContext()
+ assumeTrue(TestUtils.hasEnrolledBiometric(context))
+ assumeFalse(TestUtils.isDeviceLocked(context))
+ device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+ }
+
+ @After
+ fun tearDown() {
+ if (::device.isInitialized) {
+ TestUtils.changeOrientation(device, landscape = false)
+ device.pressHome()
+ }
+ }
+
+ @Test
+ fun testBiometricOnlyAuth_SendsError_WhenBackPressed() {
+ onView(withId(R.id.button_authenticate)).perform(click())
+ device.pressBack()
+ onView(withId(R.id.text_view_log)).check(
+ matches(withText(containsString("onAuthenticationError")))
+ )
+ }
+
+ @Test
+ fun testBiometricOnlyAuth_SendsError_WhenBackPressedAfterRotation() {
+ onView(withId(R.id.button_authenticate)).perform(click())
+ TestUtils.changeOrientation(device, landscape = true)
+ device.pressBack()
+ onView(withId(R.id.text_view_log)).check(
+ matches(withText(containsString("onAuthenticationError")))
+ )
+ }
+
+ @Test
+ fun testBiometricOnlyAuth_SendsError_WhenBackPressedAfterRepeatedRotation() {
+ onView(withId(R.id.button_authenticate)).perform(click())
+ for (i in 1..3) {
+ TestUtils.changeOrientation(device, landscape = true)
+ TestUtils.changeOrientation(device, landscape = false)
+ }
+ device.pressBack()
+ onView(withId(R.id.text_view_log)).check(
+ matches(withText(containsString("onAuthenticationError")))
+ )
+ }
+
+ @Test
+ fun testBiometricOrCredentialAuth_SendsError_WhenBackPressed() {
+ onView(withId(R.id.checkbox_allow_device_credential)).perform(click())
+ onView(withId(R.id.button_authenticate)).perform(click())
+ device.pressBack()
+ onView(withId(R.id.text_view_log)).check(
+ matches(withText(containsString("onAuthenticationError")))
+ )
+ }
+
+ @Test
+ fun testBiometricOrCredentialAuth_SendsError_WhenBackPressedAfterRotation() {
+ onView(withId(R.id.checkbox_allow_device_credential)).perform(click())
+ onView(withId(R.id.button_authenticate)).perform(click())
+ TestUtils.changeOrientation(device, landscape = true)
+ device.pressBack()
+ onView(withId(R.id.text_view_log)).check(
+ matches(withText(containsString("onAuthenticationError")))
+ )
+ }
+
+ @Test
+ fun testBiometricOrCredentialAuth_SendsError_WhenBackPressedAfterRepeatedRotation() {
+ onView(withId(R.id.checkbox_allow_device_credential)).perform(click())
+ onView(withId(R.id.button_authenticate)).perform(click())
+ for (i in 1..3) {
+ TestUtils.changeOrientation(device, landscape = true)
+ TestUtils.changeOrientation(device, landscape = false)
+ }
+ device.pressBack()
+ onView(withId(R.id.text_view_log)).check(
+ matches(withText(containsString("onAuthenticationError")))
+ )
+ }
+
+ @Test
+ fun testCancelOnConfigurationChange_SendsError_WhenDeviceRotates() {
+ onView(withId(R.id.checkbox_cancel_config_change)).perform(click())
+ onView(withId(R.id.button_authenticate)).perform(click())
+ TestUtils.changeOrientation(device, landscape = true)
+ onView(withId(R.id.text_view_log)).check(
+ matches(withText(containsString("onAuthenticationError")))
+ )
+ }
+}
\ No newline at end of file
diff --git a/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/TestUtils.kt b/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/TestUtils.kt
new file mode 100644
index 0000000..3dedd5f
--- /dev/null
+++ b/biometric/integration-tests/testapp/src/androidTest/java/androidx/biometric/integration/testapp/TestUtils.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2020 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 androidx.biometric.integration.testapp
+
+import android.app.Instrumentation
+import android.app.KeyguardManager
+import android.content.Context
+import android.os.Build
+import androidx.biometric.BiometricManager
+import androidx.biometric.BiometricManager.Authenticators
+import androidx.biometric.BiometricManager.BIOMETRIC_SUCCESS
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+
+/**
+ * A collection of testing utilities for the biometric integration test app.
+ */
+internal object TestUtils {
+ /**
+ * The maximum time that [changeOrientation] should wait for the device to finish rotating.
+ */
+ private const val ROTATE_TIMEOUT_MS = 2000L
+
+ /**
+ * Changes the [device] to [landscape] or portrait orientation and waits for rotation to finish.
+ */
+ internal fun changeOrientation(device: UiDevice, landscape: Boolean) {
+ // Create a monitor to wait for the activity to be recreated.
+ val monitor = Instrumentation.ActivityMonitor(
+ BiometricTestActivity::class.java.name,
+ null /* result */,
+ false /* block */
+ )
+ InstrumentationRegistry.getInstrumentation().addMonitor(monitor)
+
+ if (landscape) {
+ device.setOrientationLeft()
+ } else {
+ device.setOrientationNatural()
+ }
+
+ // Wait for the rotation to complete.
+ InstrumentationRegistry.getInstrumentation().waitForMonitorWithTimeout(
+ monitor,
+ ROTATE_TIMEOUT_MS
+ )
+ InstrumentationRegistry.getInstrumentation().waitForIdleSync()
+ }
+
+ /**
+ * Checks [context] to determine if the device has an enrolled biometric authentication method.
+ */
+ internal fun hasEnrolledBiometric(context: Context): Boolean {
+ val biometricManager = BiometricManager.from(context)
+ return biometricManager.canAuthenticate(Authenticators.BIOMETRIC_WEAK) == BIOMETRIC_SUCCESS
+ }
+
+ /**
+ * Checks [context] to determine if the device is currently locked.
+ */
+ internal fun isDeviceLocked(context: Context): Boolean {
+ val keyguard = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
+ context.getSystemService(KeyguardManager::class.java)
+ else
+ context.getSystemService(Context::KEYGUARD_SERVICE.toString()) as KeyguardManager?
+
+ return when {
+ keyguard == null -> false
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 -> keyguard.isDeviceLocked
+ else -> keyguard.isKeyguardLocked
+ }
+ }
+}
\ No newline at end of file
diff --git a/biometric/integration-tests/testapp/src/main/java/androidx/biometric/integration/testapp/BiometricTestActivity.kt b/biometric/integration-tests/testapp/src/main/java/androidx/biometric/integration/testapp/BiometricTestActivity.kt
index 84155bc..069fefc 100644
--- a/biometric/integration-tests/testapp/src/main/java/androidx/biometric/integration/testapp/BiometricTestActivity.kt
+++ b/biometric/integration-tests/testapp/src/main/java/androidx/biometric/integration/testapp/BiometricTestActivity.kt
@@ -253,6 +253,7 @@
private const val KEY_LOG_TEXT = "key_log_text"
private const val KEY_NAME = "mySecretKey"
private const val KEYSTORE_INSTANCE = "AndroidKeyStore"
+ private const val LATCH_AWAIT_TIMEOUT_SEC = 10L
private const val PAYLOAD = "hello"
/**
diff --git a/biometric/integration-tests/testapp/src/main/res/layout/activity_biometric_test.xml b/biometric/integration-tests/testapp/src/main/res/layout/activity_biometric_test.xml
index b4bdefb..cd8de8f 100644
--- a/biometric/integration-tests/testapp/src/main/res/layout/activity_biometric_test.xml
+++ b/biometric/integration-tests/testapp/src/main/res/layout/activity_biometric_test.xml
@@ -15,142 +15,142 @@
limitations under the License.
-->
-<LinearLayout
+<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:paddingHorizontal="8dp"
- android:paddingVertical="4dp"
- android:orientation="vertical">
-
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Authenticator types:"
- android:textColor="?android:textColorPrimary" />
-
+ android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:orientation="horizontal">
- <CheckBox
- android:id="@+id/checkbox_allow_biometric_strong"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ android:paddingHorizontal="8dp"
+ android:paddingVertical="4dp"
+ android:orientation="vertical">
+
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="BIOMETRIC_STRONG"
+ android:text="Authenticator types:"
android:textColor="?android:textColorPrimary" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <CheckBox
- android:id="@+id/checkbox_allow_biometric_weak"
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:checked="true" />
+ android:orientation="horizontal">
+ <CheckBox
+ android:id="@+id/checkbox_allow_biometric_strong"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="BIOMETRIC_STRONG"
+ android:textColor="?android:textColorPrimary" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <CheckBox
+ android:id="@+id/checkbox_allow_biometric_weak"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:checked="true" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="BIOMETRIC_WEAK"
+ android:textColor="?android:textColorPrimary" />
+ </LinearLayout>
+
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+ <CheckBox
+ android:id="@+id/checkbox_allow_device_credential"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="DEVICE_CREDENTIAL"
+ android:textColor="?android:textColorPrimary" />
+ </LinearLayout>
+
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:text="BIOMETRIC_WEAK"
+ android:text="Other options:"
android:textColor="?android:textColorPrimary" />
- </LinearLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <CheckBox
- android:id="@+id/checkbox_allow_device_credential"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="DEVICE_CREDENTIAL"
- android:textColor="?android:textColorPrimary" />
- </LinearLayout>
+ android:orientation="horizontal">
+ <CheckBox
+ android:id="@+id/checkbox_cancel_config_change"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Cancel on configuration change"
+ android:textColor="?android:textColorPrimary" />
+ </LinearLayout>
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="Other options:"
- android:textColor="?android:textColorPrimary" />
-
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <CheckBox
- android:id="@+id/checkbox_cancel_config_change"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Cancel on configuration change"
- android:textColor="?android:textColorPrimary" />
- </LinearLayout>
+ android:orientation="horizontal">
+ <CheckBox
+ android:id="@+id/checkbox_require_confirmation"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:checked="true" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Require confirmation"
+ android:textColor="?android:textColorPrimary" />
+ </LinearLayout>
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <CheckBox
- android:id="@+id/checkbox_require_confirmation"
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:checked="true" />
- <TextView
- android:layout_width="wrap_content"
+ android:orientation="horizontal">
+ <CheckBox
+ android:id="@+id/checkbox_use_crypto_auth"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Use crypto-based authentication"
+ android:textColor="?android:textColorPrimary" />
+ </LinearLayout>
+
+ <Button
+ android:id="@+id/button_can_authenticate"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Require confirmation"
- android:textColor="?android:textColorPrimary" />
- </LinearLayout>
+ android:text="Can authenticate" />
- <LinearLayout
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
- <CheckBox
- android:id="@+id/checkbox_use_crypto_auth"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
- <TextView
- android:layout_width="wrap_content"
+ <Button
+ android:id="@+id/button_authenticate"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:text="Use crypto-based authentication"
- android:textColor="?android:textColorPrimary" />
- </LinearLayout>
+ android:text="Authenticate" />
- <Button
- android:id="@+id/button_can_authenticate"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Can authenticate" />
+ <Button
+ android:id="@+id/button_clear_log"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="Clear log" />
- <Button
- android:id="@+id/button_authenticate"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Authenticate" />
-
- <Button
- android:id="@+id/button_clear_log"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Clear log" />
-
- <ScrollView
- android:layout_width="match_parent"
- android:layout_height="match_parent">
<TextView
android:id="@+id/text_view_log"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
- </ScrollView>
-</LinearLayout>
\ No newline at end of file
+ </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
index dade6b5..fa533f7 100644
--- a/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/dependencyTracker/AffectedModuleDetector.kt
@@ -461,7 +461,9 @@
),
setOf(
":support-media2-test-client",
- ":support-media2-test-service"
+ ":support-media2-test-service",
+ ":support-media2-test-client-previous",
+ ":support-media2-test-service-previous"
), // Link graphics and material to always run @Large in presubmit per b/160624022
setOf(
":compose:ui:ui-graphics",
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
index 084e74a..19909dc 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposeCallLoweringTests.kt
@@ -40,7 +40,7 @@
@Composable
fun App() {
- val cond = state { true }
+ val cond = remember { mutableStateOf(true) }
val text = if (cond.value) remember { "abc" } else remember { "def" }
Button(id=1, text=text, onClick={ cond.value = !cond.value })
}
@@ -568,7 +568,7 @@
children()
}
""",
- "SimpleComposable(state=state { 0 })"
+ "SimpleComposable(state=remember { mutableStateOf(0) })"
).then { activity ->
val button = activity.findViewById(42) as Button
button.performClick()
@@ -592,7 +592,7 @@
)
}
""",
- "SimpleComposable(state=state { 0 }, value=\"Value\")"
+ "SimpleComposable(state=remember { mutableStateOf(0) }, value=\"Value\")"
).then { activity ->
val button = activity.findViewById(42) as Button
button.performClick()
@@ -1062,7 +1062,7 @@
@Composable
fun SimpleComposable() {
a++
- val c = state { 0 }
+ val c = remember { mutableStateOf(0) }
val d = remember(c.value) { b++; b }
val recompose = invalidate
Button(
@@ -1315,7 +1315,7 @@
@Composable
fun Main() {
- var text = state { "$initialText" }
+ var text = remember { mutableStateOf("$initialText") }
Providers(TextAmbient provides text.value) {
LinearLayout {
ConsumesAmbientFromDefaultParameter()
@@ -1787,7 +1787,7 @@
@Composable
fun Counter() {
- var count = state { 0 }
+ var count = remember { mutableStateOf(0) }
TextView(
text=("Count: " + count.value),
onClick={
@@ -1819,7 +1819,7 @@
@Composable
fun Counter() {
- var count = state { 0 }
+ var count = remember { mutableStateOf(0) }
TextView(
text=("Count: " + count.value),
onClick={
@@ -1852,7 +1852,7 @@
@Composable
fun Counter(log: StringBuilder) {
- var count = state { 0 }
+ var count = remember { mutableStateOf(0) }
onCommit {
log.append("a")
}
@@ -1902,7 +1902,7 @@
@Composable
fun Counter(log: StringBuilder) {
- var count = state { 0 }
+ var count = remember { mutableStateOf(0) }
printer(log, "" + count.value)
TextView(
text=("Count: " + count.value),
@@ -2060,7 +2060,7 @@
@Composable
fun Reordering() {
- val items = state { listOf(1, 2, 3, 4, 5) }
+ val items = remember { mutableStateOf(listOf(1, 2, 3, 4, 5)) }
LinearLayout(orientation=LinearLayout.VERTICAL) {
items.value.forEachIndexed { index, id ->
@@ -2081,7 +2081,7 @@
@Composable
private fun Item(id: Int, onMove: (Int) -> Unit) {
- val count = state { 0 }
+ val count = remember { mutableStateOf(0) }
LinearLayout(orientation=LinearLayout.HORIZONTAL) {
TextView(id=(id+$tvId), text="id: ${'$'}id amt: ${'$'}{count.value}")
Button(id=(id+$btnIdAdd), text="+", onClick={ count.value++ })
@@ -2129,7 +2129,7 @@
"""
@Composable
fun SimpleComposable() {
- val count = state { 1 }
+ val count = remember { mutableStateOf(1) }
Box {
repeat(count.value) {
Button(text="Increment", onClick={ count.value += 1 }, id=(41+it))
@@ -2185,7 +2185,7 @@
@Composable
private fun StatefulButton() {
- val count = state { 0 }
+ val count = remember { mutableStateOf(0) }
Button(text="Clicked ${'$'}{count.value} times!", onClick={ count.value++ })
}
""",
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
index e33e5ae..1f1024a 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ControlFlowTransformTests.kt
@@ -2228,11 +2228,12 @@
@Test
fun testApplyOnComposableCallResult(): Unit = controlFlow(
"""
- import androidx.compose.runtime.state
+ import androidx.compose.runtime.mutableStateOf
+ import androidx.compose.runtime.remember
import androidx.compose.runtime.State
@Composable
- fun <T> provided(value: T): State<T> = state { value }.apply {
+ fun <T> provided(value: T): State<T> = remember { mutableStateOf(value) }.apply {
this.value = value
}
""",
@@ -2240,10 +2241,12 @@
@Composable
fun <T> provided(value: T, %composer: Composer<*>?, %key: Int, %changed: Int): State<T> {
%composer.startReplaceableGroup(<> xor %key, "C(provided):Test.kt")
- val tmp0 = state(null, {
- val tmp0_return = value
+ val tmp0 = remember({
+ val tmp0_return = mutableStateOf(
+ value = value
+ )
tmp0_return
- }, %composer, <>, 0, 0b0001).apply {
+ }, %composer, <>, 0).apply {
value = value
}
%composer.endReplaceableGroup()
@@ -2255,7 +2258,8 @@
@Test
fun testReturnInlinedExpressionWithCall(): Unit = controlFlow(
"""
- import androidx.compose.runtime.state
+ import androidx.compose.runtime.mutableStateOf
+ import androidx.compose.runtime.remember
import androidx.compose.runtime.State
@Composable
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt
index a314bb4..6970235 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/LambdaMemoizationTests.kt
@@ -699,7 +699,7 @@
@Composable
fun Example(model: String) {
- val s = state { model }
+ val s = remember { mutableStateOf(model) }
s.value = model
Test1({ s.value })
}
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
index 9958421..093f3b2 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/RememberIntrinsicTransformTests.kt
@@ -16,8 +16,10 @@
package androidx.compose.compiler.plugins.kotlin
+import org.junit.Ignore
import org.junit.Test
+@Ignore("Pending fix for b/162464429")
class RememberIntrinsicTransformTests : ComposeIrTransformTest() {
private fun comparisonPropagation(
unchecked: String,
diff --git a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
index 84e5b9b..a14e897 100644
--- a/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
+++ b/compose/compose-compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/analysis/ComposableCheckerTests.kt
@@ -1,11 +1,11 @@
package androidx.compose.compiler.plugins.kotlin.analysis
-import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
-import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
-import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
import androidx.compose.compiler.plugins.kotlin.AbstractComposeDiagnosticsTest
import androidx.compose.compiler.plugins.kotlin.newConfiguration
import com.intellij.openapi.util.Disposer
+import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
+import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
+import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots
class ComposableCheckerTests : AbstractComposeDiagnosticsTest() {
override fun setUp() {
@@ -879,13 +879,13 @@
@Composable fun Foo() {}
val <!COMPOSABLE_EXPECTED!>y<!>: Any get() =
- <!COMPOSABLE_INVOCATION!>state<!> { 1 }
+ <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(1) }
fun App() {
val x = object {
val <!COMPOSABLE_EXPECTED!>a<!> get() =
- <!COMPOSABLE_INVOCATION!>state<!> { 2 }
- @Composable val c get() = state { 4 }
+ <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(2) }
+ @Composable val c get() = remember { mutableStateOf(4) }
@Composable fun bar() { Foo() }
fun <!COMPOSABLE_EXPECTED!>foo<!>() {
<!COMPOSABLE_INVOCATION!>Foo<!>()
@@ -893,8 +893,8 @@
}
class Bar {
val <!COMPOSABLE_EXPECTED!>b<!> get() =
- <!COMPOSABLE_INVOCATION!>state<!> { 6 }
- @Composable val c get() = state { 7 }
+ <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(6) }
+ @Composable val c get() = remember { mutableStateOf(7) }
}
fun <!COMPOSABLE_EXPECTED!>Bam<!>() {
<!COMPOSABLE_INVOCATION!>Foo<!>()
@@ -915,16 +915,16 @@
@Composable fun App() {
val x = object {
- val <!COMPOSABLE_EXPECTED!>a<!> get() = <!COMPOSABLE_INVOCATION!>state<!> { 2 }
- @Composable val c get() = state { 4 }
+ val <!COMPOSABLE_EXPECTED!>a<!> get() = <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(2) }
+ @Composable val c get() = remember { mutableStateOf(4) }
fun <!COMPOSABLE_EXPECTED!>foo<!>() {
<!COMPOSABLE_INVOCATION!>Foo<!>()
}
@Composable fun bar() { Foo() }
}
class Bar {
- val <!COMPOSABLE_EXPECTED!>b<!> get() = <!COMPOSABLE_INVOCATION!>state<!> { 6 }
- @Composable val c get() = state { 7 }
+ val <!COMPOSABLE_EXPECTED!>b<!> get() = <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(6) }
+ @Composable val c get() = remember { mutableStateOf(7) }
}
fun <!COMPOSABLE_EXPECTED!>Bam<!>() {
<!COMPOSABLE_INVOCATION!>Foo<!>()
@@ -943,10 +943,10 @@
@Composable fun App() {
val x = object {
- val b = state { 3 }
+ val b = remember { mutableStateOf(3) }
}
class Bar {
- val a = <!COMPOSABLE_INVOCATION!>state<!> { 5 }
+ val a = <!COMPOSABLE_INVOCATION!>remember<!> { mutableStateOf(5) }
}
print(x)
}
diff --git a/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt b/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
index ee3a599..5f3ccaf 100644
--- a/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
+++ b/compose/compose-compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
@@ -2433,7 +2433,8 @@
private fun visitComposableCall(expression: IrCall): IrExpression {
return when (expression.symbol.descriptor.fqNameSafe) {
- ComposeFqNames.remember -> visitRememberCall(expression)
+ // TODO: re-enable this once b/162464429 is addressed
+ // ComposeFqNames.remember -> visitRememberCall(expression)
ComposeFqNames.key -> visitKeyCall(expression)
else -> visitNormalComposableCall(expression)
}
diff --git a/compose/compose-runtime/api/current.txt b/compose/compose-runtime/api/current.txt
index c09afc7..4af1087 100644
--- a/compose/compose-runtime/api/current.txt
+++ b/compose/compose-runtime/api/current.txt
@@ -283,8 +283,8 @@
method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
- method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
- method @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+ method @Deprecated @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
+ method @Deprecated @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
method @androidx.compose.runtime.Composable public static inline <T, reified V1, reified V2> androidx.compose.runtime.MutableState<T>! stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
diff --git a/compose/compose-runtime/api/public_plus_experimental_current.txt b/compose/compose-runtime/api/public_plus_experimental_current.txt
index c09afc7..4af1087 100644
--- a/compose/compose-runtime/api/public_plus_experimental_current.txt
+++ b/compose/compose-runtime/api/public_plus_experimental_current.txt
@@ -283,8 +283,8 @@
method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
- method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
- method @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+ method @Deprecated @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
+ method @Deprecated @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
method @androidx.compose.runtime.Composable public static inline <T, reified V1, reified V2> androidx.compose.runtime.MutableState<T>! stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
diff --git a/compose/compose-runtime/api/restricted_current.txt b/compose/compose-runtime/api/restricted_current.txt
index 5cb67aa..6feabb4 100644
--- a/compose/compose-runtime/api/restricted_current.txt
+++ b/compose/compose-runtime/api/restricted_current.txt
@@ -303,8 +303,8 @@
method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> neverEqualPolicy();
method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> referentialEqualityPolicy();
method public static inline operator <T> void setValue(androidx.compose.runtime.MutableState<T>, Object? thisObj, kotlin.reflect.KProperty<?> property, T? value);
- method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
- method @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
+ method @Deprecated @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> state(androidx.compose.runtime.SnapshotMutationPolicy<T> policy = structuralEqualityPolicy(), kotlin.jvm.functions.Function0<? extends T> init);
+ method @Deprecated @androidx.compose.runtime.Composable public static inline <T, V1> androidx.compose.runtime.MutableState<T> stateFor(V1? v1, kotlin.jvm.functions.Function0<? extends T> init);
method @androidx.compose.runtime.Composable public static inline <T> androidx.compose.runtime.MutableState<T> stateFor(Object![]? inputs, kotlin.jvm.functions.Function0<? extends T> init);
method @androidx.compose.runtime.Composable public static inline <T, reified V1, reified V2> androidx.compose.runtime.MutableState<T>! stateFor(V1? v1, V2? v2, kotlin.jvm.functions.Function0<? extends T> init);
method public static <T> androidx.compose.runtime.SnapshotMutationPolicy<T> structuralEqualityPolicy();
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt
index 88548d3..8eed09e 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/CustomTreeCompositionSamples.kt
@@ -25,8 +25,9 @@
import androidx.compose.runtime.compositionFor
import androidx.compose.runtime.emit
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
@Suppress("unused")
@OptIn(ExperimentalComposeApi::class)
@@ -86,7 +87,7 @@
// and then a sample tree could be composed:
fun runApp(root: GroupNode) {
root.setContent {
- var count by state { 0 }
+ var count by remember { mutableStateOf(0) }
Group {
Text("Count: $count")
Text("Increment") { count++ }
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt
index b588be7..35f1b29 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/EffectSamples.kt
@@ -17,17 +17,17 @@
package androidx.compose.runtime.samples
import androidx.annotation.Sampled
+import androidx.compose.foundation.Text
+import androidx.compose.foundation.layout.Row
+import androidx.compose.material.Button
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.getValue
import androidx.compose.runtime.key
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.onCommit
+import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.runtime.stateFor
-import androidx.compose.foundation.Text
-import androidx.compose.foundation.layout.Row
-import androidx.compose.material.Button
@Suppress("unused")
@Sampled
@@ -35,7 +35,7 @@
fun observeUserSample() {
@Composable
fun observeUser(userId: Int): User? {
- val user = stateFor<User?>(userId) { null }
+ val user = remember(userId) { mutableStateOf<User?>(null) }
onCommit(userId) {
val subscription = UserAPI.subscribeToUser(userId) {
user.value = it
@@ -52,7 +52,7 @@
@Composable
fun twoInputsKeySample() {
for (element in elements) {
- val selected by key(element.id, parentId) { state { false } }
+ val selected by key(element.id, parentId) { remember { mutableStateOf(false) } }
ListItem(item = element, selected = selected)
}
}
@@ -60,7 +60,7 @@
@Sampled
@Composable
fun SimpleStateSample() {
- val count = state { 0 }
+ val count = remember { mutableStateOf(0) }
Text(text = "You clicked ${count.value} times")
Button(onClick = { count.value++ }) {
@@ -71,7 +71,7 @@
@Sampled
@Composable
fun DestructuredStateSample() {
- val (count, setCount) = state { 0 }
+ val (count, setCount) = remember { mutableStateOf(0) }
Text(text = "You clicked $count times")
Button(onClick = { setCount(count + 1) }) {
@@ -101,7 +101,7 @@
@Sampled
@Composable
fun DelegatedStateSample() {
- var count by state { 0 }
+ var count by remember { mutableStateOf(0) }
Text(text = "You clicked $count times")
Button(onClick = { count = count + 1 }) {
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt
index a7919a7..b3ec59c 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/ModelSamples.kt
@@ -17,15 +17,16 @@
package androidx.compose.runtime.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
import androidx.compose.foundation.BaseTextField
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Text
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.material.Button
+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.text.input.TextFieldValue
@Composable
@OptIn(ExperimentalFoundationApi::class)
@@ -33,8 +34,8 @@
fun stateSample() {
@Composable
fun LoginScreen() {
- var username by state { TextFieldValue("user") }
- var password by state { TextFieldValue("pass") }
+ var username by remember { mutableStateOf(TextFieldValue("user")) }
+ var password by remember { mutableStateOf(TextFieldValue("pass")) }
fun login() = Api.login(username.text, password.text)
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt
index 93bd48e..2160a32 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateListSamples.kt
@@ -17,18 +17,19 @@
package androidx.compose.runtime.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
import androidx.compose.foundation.BaseTextField
import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.mutableStateListOf
-import androidx.compose.runtime.state
import androidx.compose.foundation.Text
-import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.material.Button
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.text.input.TextFieldValue
@Composable
@OptIn(ExperimentalFoundationApi::class)
@@ -36,7 +37,7 @@
fun stateListSample() {
@Composable
fun Names() {
- var name by state { TextFieldValue("user") }
+ var name by remember { mutableStateOf(TextFieldValue("user")) }
val names = mutableStateListOf<String>()
Column {
diff --git a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt
index 4fdf50f..be6136f 100644
--- a/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt
+++ b/compose/compose-runtime/samples/src/main/java/androidx/compose/runtime/samples/MutableStateMapSample.kt
@@ -17,18 +17,19 @@
package androidx.compose.runtime.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
import androidx.compose.foundation.BaseTextField
import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.mutableStateMapOf
-import androidx.compose.runtime.state
import androidx.compose.foundation.Text
-import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.material.Button
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateMapOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.text.input.TextFieldValue
@Composable
@OptIn(ExperimentalFoundationApi::class)
@@ -36,8 +37,8 @@
fun stateMapSample() {
@Composable
fun NamesAndAges() {
- var name by state { TextFieldValue("name") }
- var saying by state { TextFieldValue("saying") }
+ var name by remember { mutableStateOf(TextFieldValue("name")) }
+ var saying by remember { mutableStateOf(TextFieldValue("saying")) }
val sayings = mutableStateMapOf(
"Caesar" to "Et tu, Brute?",
"Hamlet" to "To be or not to be",
diff --git a/compose/compose-runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt b/compose/compose-runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt
index 8d1aaf2..78f96f3 100644
--- a/compose/compose-runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt
+++ b/compose/compose-runtime/src/androidAndroidTest/kotlin/androidx/compose/runtime/EffectsTests.kt
@@ -100,7 +100,7 @@
var local = mutableStateOf("invalid")
compose {
- local = state { "Hello world! ${inc++}" }
+ local = remember { mutableStateOf("Hello world! ${inc++}") } // NOTYPO
TextView(id = tv1Id, text = local.value)
}.then { activity ->
val helloText = activity.findViewById(tv1Id) as TextView
@@ -127,8 +127,8 @@
var local2 = mutableStateOf("invalid")
compose {
- local1 = state { "First" }
- local2 = state { "Second" }
+ local1 = remember { mutableStateOf("First") }
+ local2 = remember { mutableStateOf("Second") }
TextView(id = tv1Id, text = local1.value)
TextView(id = tv2Id, text = local2.value)
}.then { activity ->
@@ -491,7 +491,7 @@
@Composable
fun UpdateStateInPreCommit() {
- var value by state { 1 }
+ var value by remember { mutableStateOf(1) }
readValue = value
onPreCommit {
value = 2
@@ -730,7 +730,7 @@
var inc = 0
compose {
- val local = state { "Hello world! ${inc++}" }
+ val local = remember { mutableStateOf("Hello world! ${inc++}") } // NOTYPO
TextView(id = tv1Id, text = local.value)
}.then { activity ->
val helloText = activity.findViewById(tv1Id) as TextView
diff --git a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt
index dd6cf76..eaa45d6 100644
--- a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt
+++ b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/Ambient.kt
@@ -109,7 +109,7 @@
) : ProvidableAmbient<T>(defaultFactory) {
@Composable
- override fun provided(value: T): State<T> = state(policy) { value }.apply {
+ override fun provided(value: T): State<T> = remember { mutableStateOf(value, policy) }.apply {
this.value = value
}
}
diff --git a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/FlowAdapter.kt b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/FlowAdapter.kt
index 501beaf..147103a 100644
--- a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/FlowAdapter.kt
+++ b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/FlowAdapter.kt
@@ -55,7 +55,7 @@
initial: R,
context: CoroutineContext = EmptyCoroutineContext
): State<R> {
- val state = state { initial }
+ val state = remember { mutableStateOf(initial) }
launchInComposition(this, context) {
if (context == EmptyCoroutineContext) {
collect {
diff --git a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt
index 8d2ef55..91dd85d 100644
--- a/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt
+++ b/compose/compose-runtime/src/commonMain/kotlin/androidx/compose/runtime/MutableState.kt
@@ -64,6 +64,10 @@
* @see [remember]
* @see [SnapshotMutationPolicy]
*/
+@Deprecated(
+ "Replace with explicit use of remember {}",
+ ReplaceWith("remember { mutableStateOf(init(), policy) }")
+)
@Composable
inline fun <T> state(
policy: SnapshotMutationPolicy<T> = structuralEqualityPolicy(),
@@ -91,6 +95,10 @@
* @see [state]
* @see [remember]
*/
+@Deprecated(
+ "Replace with explicit use of remember {}",
+ ReplaceWith("remember(v1) { mutableStateOf(init()) }")
+)
@Composable
inline fun <T, /*reified*/ V1> stateFor(
v1: V1,
@@ -342,7 +350,7 @@
* The componentN() operators allow state objects to be used with the property destructuring
* syntax
*
- * var (foo, setFoo) = state { 0 }
+ * var (foo, setFoo) = remember { mutableStateOf(0) }
* setFoo(123) // set
* foo == 123 // get
*/
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java
index 8a81ec7..8ed4db9 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTrackerTest.java
@@ -49,7 +49,6 @@
private static final String SELECTION_ID = "test-selection";
- private List<String> mItems;
private Set<String> mIgnored;
private TestAdapter<String> mAdapter;
private SelectionPredicate<String> mSelectionPredicate;
@@ -61,10 +60,8 @@
@Before
public void setUp() throws Exception {
mIgnored = new HashSet<>();
- mItems = TestAdapter.createItemList(100);
+ mAdapter = TestAdapter.createStringAdapter(100);
mListener = new TestSelectionObserver<>();
- mAdapter = new TestAdapter();
- mAdapter.updateTestModelIds(mItems);
mSelectionPredicate = new SelectionPredicate<String>() {
@@ -103,23 +100,23 @@
@Test
public void testSelect() {
- mTracker.select(mItems.get(7));
+ mTracker.select(mAdapter.getSelectionKey(7));
mSelection.assertSelection(7);
}
@Test
public void testDeselect() {
- mTracker.select(mItems.get(7));
- mTracker.deselect(mItems.get(7));
+ mTracker.select(mAdapter.getSelectionKey(7));
+ mTracker.deselect(mAdapter.getSelectionKey(7));
mSelection.assertNoSelection();
}
@Test
public void testSelection_DoNothingOnUnselectableItem() {
- mIgnored.add(mItems.get(7));
- boolean selected = mTracker.select(mItems.get(7));
+ mIgnored.add(mAdapter.getSelectionKey(7));
+ boolean selected = mTracker.select(mAdapter.getSelectionKey(7));
assertFalse(selected);
mSelection.assertNoSelection();
@@ -127,37 +124,37 @@
@Test
public void testSelect_NotifiesListenersOfChange() {
- mTracker.select(mItems.get(7));
+ mTracker.select(mAdapter.getSelectionKey(7));
mListener.assertSelectionChanged();
}
@Test
public void testSelect_NotifiesAdapterOfSelect() {
- mTracker.select(mItems.get(7));
+ mTracker.select(mAdapter.getSelectionKey(7));
mAdapter.assertNotifiedOfSelectionChange(7);
}
@Test
public void testSelect_NotifiesAdapterOfDeselect() {
- mTracker.select(mItems.get(7));
+ mTracker.select(mAdapter.getSelectionKey(7));
mAdapter.resetSelectionNotifications();
- mTracker.deselect(mItems.get(7));
+ mTracker.deselect(mAdapter.getSelectionKey(7));
mAdapter.assertNotifiedOfSelectionChange(7);
}
@Test
public void testDeselect_SelectionChange_Notifies() {
- mTracker.select(mItems.get(7));
- mTracker.deselect(mItems.get(7));
+ mTracker.select(mAdapter.getSelectionKey(7));
+ mTracker.deselect(mAdapter.getSelectionKey(7));
mListener.assertSelectionChanged();
}
@Test
public void testClearSelection_ClearSelection_Notifies() {
- mTracker.select(mItems.get(7));
+ mTracker.select(mAdapter.getSelectionKey(7));
mTracker.clearSelection();
mListener.assertSelectionCleared();
@@ -175,8 +172,11 @@
@Test
public void testSelection_PersistsOnUpdate() {
- mTracker.select(mItems.get(7));
- mAdapter.updateTestModelIds(mItems);
+ mTracker.select(mAdapter.getSelectionKey(7));
+
+ List<String> newItems = new ArrayList<>();
+ newItems.addAll(mAdapter.getItems().subList(0, 10));
+ mAdapter.updateTestModelIds(newItems);
mSelection.assertSelection(7);
}
@@ -190,7 +190,7 @@
@Test
public void testSetItemsSelected_SkipUnselectableItem() {
- mIgnored.add(mItems.get(7));
+ mIgnored.add(mAdapter.getSelectionKey(7));
mTracker.setItemsSelected(getStringIds(6, 7, 8), true);
@@ -201,8 +201,8 @@
@Test
public void testClearSelection_RemovesPrimarySelection() {
- mTracker.select(mItems.get(1));
- mTracker.select(mItems.get(2));
+ mTracker.select(mAdapter.getSelectionKey(1));
+ mTracker.select(mAdapter.getSelectionKey(2));
assertTrue(mTracker.clearSelection());
@@ -212,8 +212,8 @@
@Test
public void testClearSelection_RemovesProvisionalSelection() {
Set<String> prov = new HashSet<>();
- prov.add(mItems.get(1));
- prov.add(mItems.get(2));
+ prov.add(mAdapter.getSelectionKey(1));
+ prov.add(mAdapter.getSelectionKey(2));
assertFalse(mTracker.clearSelection());
assertFalse(mTracker.hasSelection());
@@ -221,7 +221,7 @@
@Test
public void testRequiresReset_ForSelection() {
- mTracker.select(mItems.get(1));
+ mTracker.select(mAdapter.getSelectionKey(1));
assertTrue(mTracker.isResetRequired());
}
@@ -229,7 +229,7 @@
@Test
public void testRequiresReset_ForProvisionalSelection() {
Set<String> items = new HashSet<>();
- items.add(mItems.get(1));
+ items.add(mAdapter.getSelectionKey(1));
mTracker.setProvisionalSelection(items);
@@ -245,7 +245,7 @@
@Test
public void testReset_ForSelection() {
- mTracker.select(mItems.get(1));
+ mTracker.select(mAdapter.getSelectionKey(1));
mTracker.reset();
assertFalse(mTracker.isResetRequired());
@@ -254,7 +254,7 @@
@Test
public void testReset_ForProvisionalSelection() {
Set<String> items = new HashSet<>();
- items.add(mItems.get(1));
+ items.add(mAdapter.getSelectionKey(1));
mTracker.setProvisionalSelection(items);
mTracker.reset();
@@ -263,10 +263,10 @@
@Test
public void testReset_Combined() {
- mTracker.select(mItems.get(1));
+ mTracker.select(mAdapter.getSelectionKey(1));
Set<String> items = new HashSet<>();
- items.add(mItems.get(1));
+ items.add(mAdapter.getSelectionKey(1));
mTracker.setProvisionalSelection(items);
mTracker.startRange(15);
@@ -292,7 +292,7 @@
@Test
public void testRangeSelection_SkipUnselectableItem() {
- mIgnored.add(mItems.get(17));
+ mIgnored.add(mAdapter.getSelectionKey(17));
mTracker.startRange(15);
mTracker.extendRange(19);
@@ -391,8 +391,8 @@
mSelection.assertNoSelection();
// Mimicking band selection case -- BandController notifies item callback by itself.
- mListener.onItemStateChanged(mItems.get(1), true);
- mListener.onItemStateChanged(mItems.get(2), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(1), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(2), true);
SparseBooleanArray provisional = new SparseBooleanArray();
provisional.append(1, true);
@@ -406,19 +406,19 @@
Selection<String> s = mTracker.getSelection();
// Mimicking band selection case -- BandController notifies item callback by itself.
- mListener.onItemStateChanged(mItems.get(1), true);
- mListener.onItemStateChanged(mItems.get(2), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(1), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(2), true);
SparseBooleanArray provisional = new SparseBooleanArray();
provisional.append(1, true);
provisional.append(2, true);
s.setProvisionalSelection(getItemIds(provisional));
- mListener.onItemStateChanged(mItems.get(1), false);
- mListener.onItemStateChanged(mItems.get(2), false);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(1), false);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(2), false);
provisional.clear();
- mListener.onItemStateChanged(mItems.get(3), true);
- mListener.onItemStateChanged(mItems.get(4), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(3), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(4), true);
provisional.append(3, true);
provisional.append(4, true);
s.setProvisionalSelection(getItemIds(provisional));
@@ -430,18 +430,18 @@
Selection<String> s = mTracker.getSelection();
// Mimicking band selection case -- BandController notifies item callback by itself.
- mListener.onItemStateChanged(mItems.get(1), true);
- mListener.onItemStateChanged(mItems.get(2), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(1), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(2), true);
SparseBooleanArray provisional = new SparseBooleanArray();
provisional.append(1, true);
provisional.append(2, true);
s.setProvisionalSelection(getItemIds(provisional));
- mListener.onItemStateChanged(mItems.get(1), false);
- mListener.onItemStateChanged(mItems.get(2), false);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(1), false);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(2), false);
provisional.clear();
- mListener.onItemStateChanged(mItems.get(1), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(1), true);
provisional.append(1, true);
s.setProvisionalSelection(getItemIds(provisional));
mSelection.assertSelection(1);
@@ -452,8 +452,8 @@
Selection<String> s = mTracker.getSelection();
// Mimicking band selection case -- BandController notifies item callback by itself.
- mListener.onItemStateChanged(mItems.get(1), true);
- mListener.onItemStateChanged(mItems.get(2), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(1), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(2), true);
SparseBooleanArray provisional = new SparseBooleanArray();
provisional.append(1, true);
provisional.append(2, true);
@@ -465,8 +465,8 @@
@Test
public void testProvisionalSelection_Cancel() {
- mTracker.select(mItems.get(1));
- mTracker.select(mItems.get(2));
+ mTracker.select(mAdapter.getSelectionKey(1));
+ mTracker.select(mAdapter.getSelectionKey(2));
Selection<String> s = mTracker.getSelection();
SparseBooleanArray provisional = new SparseBooleanArray();
@@ -481,12 +481,12 @@
@Test
public void testProvisionalSelection_IntersectsAppliedSelection() {
- mTracker.select(mItems.get(1));
- mTracker.select(mItems.get(2));
+ mTracker.select(mAdapter.getSelectionKey(1));
+ mTracker.select(mAdapter.getSelectionKey(2));
Selection<String> s = mTracker.getSelection();
// Mimicking band selection case -- BandController notifies item callback by itself.
- mListener.onItemStateChanged(mItems.get(3), true);
+ mListener.onItemStateChanged(mAdapter.getSelectionKey(3), true);
SparseBooleanArray provisional = new SparseBooleanArray();
provisional.append(2, true);
provisional.append(3, true);
@@ -499,7 +499,7 @@
int count = selection.size();
for (int i = 0; i < count; ++i) {
- ids.add(mItems.get(selection.keyAt(i)));
+ ids.add(mAdapter.getSelectionKey(selection.keyAt(i)));
}
return ids;
@@ -522,11 +522,11 @@
mSelection = new SelectionProbe(mTracker, mListener);
for (int i = 2; i < 7; i++) {
- mTracker.select(mItems.get(i));
+ mTracker.select(mAdapter.getSelectionKey(i));
}
- mIgnored.add(mItems.get(3));
- mIgnored.add(mItems.get(5));
+ mIgnored.add(mAdapter.getSelectionKey(3));
+ mIgnored.add(mAdapter.getSelectionKey(5));
mAdapter.notifyDataSetChanged();
@@ -571,7 +571,7 @@
private Iterable<String> getStringIds(int... ids) {
List<String> stringIds = new ArrayList<>(ids.length);
for (int id : ids) {
- stringIds.add(mItems.get(id));
+ stringIds.add(mAdapter.getSelectionKey(id));
}
return stringIds;
}
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
index 438c938..6dac018 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/DefaultSelectionTracker_SingleSelectTest.java
@@ -27,32 +27,28 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.List;
-
@RunWith(AndroidJUnit4.class)
@SmallTest
public class DefaultSelectionTracker_SingleSelectTest {
- private List<String> mItems;
private SelectionTracker<String> mTracker;
+ private TestAdapter<String> mAdapter;
private TestSelectionObserver<String> mListener;
private SelectionProbe mSelection;
@Before
public void setUp() throws Exception {
- mItems = TestAdapter.createItemList(100);
+ mAdapter = TestAdapter.createStringAdapter(100);
mListener = new TestSelectionObserver<>();
- TestAdapter<String> adapter = new TestAdapter<>();
- adapter.updateTestModelIds(mItems);
ItemKeyProvider<String> keyProvider =
- new TestItemKeyProvider<>(ItemKeyProvider.SCOPE_MAPPED, adapter);
+ new TestItemKeyProvider<>(ItemKeyProvider.SCOPE_MAPPED, mAdapter);
mTracker = new DefaultSelectionTracker<>(
"single-selection-test",
keyProvider,
SelectionPredicates.createSelectSingleAnything(),
StorageStrategy.createStringStorage());
- EventBridge.install(adapter, mTracker, keyProvider);
+ EventBridge.install(mAdapter, mTracker, keyProvider);
mTracker.addObserver(mListener);
@@ -61,15 +57,16 @@
@Test
public void testSimpleSelect() {
- mTracker.select(mItems.get(3));
- mTracker.select(mItems.get(4));
+ mTracker.select(mAdapter.getSelectionKey(3));
+ mTracker.select(mAdapter.getSelectionKey(4));
mListener.assertSelectionChanged();
+ // 3 should no longer be selected because of single select mode.
mSelection.assertSelection(4);
}
@Test
public void testRangeSelectionNotEstablished() {
- mTracker.select(mItems.get(3));
+ mTracker.select(mAdapter.getSelectionKey(3));
mListener.reset();
mTracker.extendRange(10);
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/StableIdKeyProviderTest.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/StableIdKeyProviderTest.java
index 33c0c80..92089428 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/StableIdKeyProviderTest.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/StableIdKeyProviderTest.java
@@ -16,10 +16,22 @@
package androidx.recyclerview.selection;
+import static androidx.recyclerview.selection.StableIdKeyProvider.ViewHost;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
import android.content.Context;
import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.selection.testing.TestAdapter;
+import androidx.recyclerview.selection.testing.TestHolder;
import androidx.recyclerview.widget.RecyclerView;
+import androidx.recyclerview.widget.RecyclerView.ViewHolder;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
@@ -28,30 +40,139 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
@RunWith(AndroidJUnit4.class)
@SmallTest
public class StableIdKeyProviderTest {
private Context mContext;
- private RecyclerView mRecyclerView;
+ private StableIdTestAdapter mAdapter;
+ private TestViewHost mHost;
private StableIdKeyProvider mKeyProvider;
@Before
public void setUp() {
mContext = ApplicationProvider.getApplicationContext();
- mRecyclerView = new RecyclerView(mContext);
- mKeyProvider = new StableIdKeyProvider(mRecyclerView);
+ mAdapter = new StableIdTestAdapter();
+ mHost = new TestViewHost(mContext, mAdapter);
+ mKeyProvider = new StableIdKeyProvider(mHost);
}
@Test
- public void testOnAttached_NullViewHolder() {
- View v = new View(mContext);
- mKeyProvider.onAttached(v);
+ public void testNotAttached() {
+ assertEquals(RecyclerView.NO_POSITION, mKeyProvider.getPosition(1L));
+ assertNull(mKeyProvider.getKey(1));
}
@Test
- public void testOnDetatched_NullViewHolder() {
- View v = new View(mContext);
- mKeyProvider.onDetached(v);
+ public void testAttachedItems() {
+ mHost.addViewHolder(1);
+ mHost.addViewHolder(2);
+ assertEquals(Long.valueOf(1), mKeyProvider.getKey(1));
+ assertEquals(Long.valueOf(2), mKeyProvider.getKey(2));
+ }
+
+ @Test
+ public void testRecycledItems() {
+ mHost.addViewHolder(1);
+ mHost.addViewHolder(2);
+ mHost.removeViewHolder(1);
+ mHost.addViewHolder(3);
+ assertEquals(RecyclerView.NO_POSITION, mKeyProvider.getPosition(1L));
+ assertNull(mKeyProvider.getKey(1));
+ // Ensure item "2" remains accessible, and 3 is present.
+ assertEquals(Long.valueOf(2), mKeyProvider.getKey(2));
+ assertEquals(Long.valueOf(3), mKeyProvider.getKey(3));
+ }
+
+ private static class TestViewHost implements ViewHost, ViewHost.LifecycleListener {
+
+ Map<View, ViewHolder> mViews = new HashMap<>();
+ private @Nullable LifecycleListener mListener;
+ private final Context mContext;
+ private final StableIdTestAdapter mAdapter;
+
+ TestViewHost(Context context, StableIdTestAdapter adapter) {
+ mContext = context;
+ mAdapter = adapter;
+ }
+
+ void addViewHolder(int position) {
+ // This is usually implemented by findContainingViewHolder.
+ // Here we use the adapter, since it is providing holders in our test.
+ LinearLayout view = new LinearLayout(mContext);
+ TestHolder holder = mAdapter.getHolder(view, position);
+ mViews.put(view, holder);
+ onAttached(view);
+ }
+
+ void removeViewHolder(int position) {
+ View toRemove = null;
+ for (Map.Entry<View, ViewHolder> entry : mViews.entrySet()) {
+ if (entry.getValue().getLayoutPosition() == position) {
+ toRemove = entry.getKey();
+ break;
+ }
+ }
+
+ if (toRemove != null) {
+ onRecycled(toRemove);
+ // Defer removing until after listeners get notified.
+ mViews.remove(toRemove);
+ }
+
+ }
+
+ @Override
+ public void registerLifecycleListener(@NonNull LifecycleListener listener) {
+ mListener = listener;
+ }
+
+ @Override
+ public @Nullable ViewHolder findViewHolder(@NonNull View view) {
+ // This is usually implemented by findContainingViewHolder.
+ // Here we use the adapter, since it is providing holders in our test.
+ return mViews.get(view);
+ }
+
+ @Override
+ public int getPosition(@NonNull ViewHolder holder) {
+ // Note, we use getLayoutPosition rather than getAbsoluteAdapterPosition
+ // because the latter requires an owning RecyclerView.
+ // In lieu of that, we use getLayoutPosition which is set
+ // and stored as a field on the holder at the time the holder is bound.
+ // This is a small contrivance necessary to support testability.
+ return holder.getLayoutPosition();
+ }
+
+ @Override
+ public void onAttached(@NonNull View view) {
+ mListener.onAttached(view);
+ }
+
+ @Override
+ public void onRecycled(@NonNull View view) {
+ mListener.onRecycled(view);
+ }
+ }
+
+ private static final class StableIdTestAdapter extends TestAdapter<Long> {
+ StableIdTestAdapter() {
+ super(Collections.EMPTY_LIST, true);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ TestHolder getHolder(ViewGroup view, int position) {
+ TestHolder holder = new TestHolder(view);
+ bindViewHolder(holder, position);
+ return holder;
+ }
}
}
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestAdapter.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestAdapter.java
index 03702e2..99793d1 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestAdapter.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestAdapter.java
@@ -20,6 +20,7 @@
import android.view.ViewGroup;
+import androidx.annotation.NonNull;
import androidx.recyclerview.selection.SelectionTracker;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.Adapter;
@@ -40,7 +41,12 @@
}
public TestAdapter(List<K> items) {
+ this(items, false);
+ }
+
+ public TestAdapter(List<K> items, boolean hasStableIds) {
mItems.addAll(items);
+ setHasStableIds(hasStableIds);
mAdapterObserver = new RecyclerView.AdapterDataObserver() {
@Override
@@ -75,13 +81,15 @@
}
@Override
- public TestHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- return new TestHolder(parent);
+ public @NonNull TestHolder onCreateViewHolder(@NonNull ViewGroup view, int viewType) {
+ return new TestHolder(view);
}
@Override
- public void onBindViewHolder(TestHolder holder, int position) {
- throw new UnsupportedOperationException();
+ public void onBindViewHolder(@NonNull TestHolder holder, int position) {
+ // Ignore calls to this method which is called when bindViewHolder
+ // is called. Some tests depend on bindViewHolder setting up position
+ // and id information in ViewHolders.
}
@Override
@@ -104,7 +112,6 @@
return mItems.get(position);
}
-
public void resetSelectionNotifications() {
mNotifiedOfSelection.clear();
}
@@ -113,11 +120,18 @@
assertTrue(mNotifiedOfSelection.contains(position));
}
- public static List<String> createItemList(int num) {
+ /*
+ * Returns a reference to internal item list. Obvi for test only.
+ */
+ public List<K> getItems() {
+ return mItems;
+ }
+
+ public static TestAdapter<String> createStringAdapter(int num) {
List<String> items = new ArrayList<>(num);
for (int i = 0; i < num; ++i) {
items.add(Integer.toString(i));
}
- return items;
+ return new TestAdapter<>(items);
}
}
diff --git a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestHolder.java b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestHolder.java
index 055d102..b94399e 100644
--- a/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestHolder.java
+++ b/recyclerview/recyclerview-selection/src/androidTest/java/androidx/recyclerview/selection/testing/TestHolder.java
@@ -16,12 +16,12 @@
package androidx.recyclerview.selection.testing;
-import android.view.View;
+import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView.ViewHolder;
public class TestHolder extends ViewHolder {
- public TestHolder(View itemView) {
- super(itemView);
+ public TestHolder(ViewGroup view) {
+ super(view);
}
}
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java
index 61985cf..1083165 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/DefaultSelectionTracker.java
@@ -191,7 +191,7 @@
private Selection<K> clearSelectionQuietly() {
mRange = null;
- MutableSelection<K> prevSelection = new MutableSelection();
+ MutableSelection<K> prevSelection = new MutableSelection<>();
if (hasSelection()) {
copySelection(prevSelection);
mSelection.clear();
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java
index 1cdf135..0c290ca 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/ItemDetailsLookup.java
@@ -172,7 +172,8 @@
/**
* Returns the adapter position of the item. See
- * {@link RecyclerView.ViewHolder#getAdapterPosition() ViewHolder.getAdapterPosition}
+ * {@link RecyclerView.ViewHolder#getAbsoluteAdapterPosition() ViewHolder
+ * .getAbsoluteAdapterPosition}
*
* @return the position of an item.
*/
diff --git a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/StableIdKeyProvider.java b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/StableIdKeyProvider.java
index bfda007..648121c 100644
--- a/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/StableIdKeyProvider.java
+++ b/recyclerview/recyclerview-selection/src/main/java/androidx/recyclerview/selection/StableIdKeyProvider.java
@@ -16,6 +16,8 @@
package androidx.recyclerview.selection;
+import static androidx.core.util.Preconditions.checkArgument;
+import static androidx.core.util.Preconditions.checkNotNull;
import static androidx.recyclerview.selection.Shared.DEBUG;
import android.util.Log;
@@ -27,16 +29,28 @@
import androidx.collection.LongSparseArray;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.RecyclerView.OnChildAttachStateChangeListener;
+import androidx.recyclerview.widget.RecyclerView.RecyclerListener;
+import androidx.recyclerview.widget.RecyclerView.ViewHolder;
/**
* An {@link ItemKeyProvider} that provides stable ids by way of cached
- * {@link RecyclerView.Adapter} stable ids. Items enter the cache as they are laid out by
- * RecyclerView, and are removed from the cache as they are recycled.
+ * {@link RecyclerView.Adapter} stable ids. Items enter the cache as they are
+ * attached by RecyclerView and are removed when they are recycled.
*
* <p>
* There are trade-offs with this implementation as it necessarily auto-boxes {@code long}
* stable id values into {@code Long} values for use as selection keys. The core Selection API
* uses a parameterized key type to permit other keys (such as Strings or URIs).
+ *
+ * <p>
+ * FYI: Use of StableIdKeyProvider limits the availability of some features
+ * such as mouse-driven band selection that may otherwise provide an enhanced
+ * experience for users of ChromeOS or other devices with attached pointing devices.
+ * For that reason, consider implementing your own {@link ItemKeyProvider}
+ * that can provide item keys based on your item data, such as a stable
+ * {@link android.net.Uri} or other unique identifier. For an example of
+ * such a provider see com.example.android.supportv7.widget.selection.fancy.DemoAdapter.KeyProvider
+ * in the SupportV7 Demos package.
*/
public final class StableIdKeyProvider extends ItemKeyProvider<Long> {
@@ -44,7 +58,32 @@
private final SparseArray<Long> mPositionToKey = new SparseArray<>();
private final LongSparseArray<Integer> mKeyToPosition = new LongSparseArray<>();
- private final RecyclerView mRecyclerView;
+ private final ViewHost mHost;
+
+ StableIdKeyProvider(@NonNull ViewHost host) {
+ // Provider is based on the stable ids provided by ViewHolders which
+ // are only accessible when the holders are attached or yet-to-be-recycled.
+ // For that reason we can only satisfy "CACHED" scope key access which
+ // limits library features such as mouse-driven band selection.
+ super(SCOPE_CACHED);
+
+ checkNotNull(host);
+ mHost = host;
+
+ mHost.registerLifecycleListener(
+ new ViewHost.LifecycleListener() {
+ @Override
+ public void onAttached(@NonNull View view) {
+ StableIdKeyProvider.this.onAttached(view);
+ }
+
+ @Override
+ public void onRecycled(@NonNull View view) {
+ StableIdKeyProvider.this.onRecycled(view);
+ }
+ }
+ );
+ }
/**
* Creates a new key provider that uses cached {@code long} stable ids associated
@@ -53,39 +92,23 @@
* @param recyclerView the owner RecyclerView
*/
public StableIdKeyProvider(@NonNull RecyclerView recyclerView) {
+ this(new DefaultViewHost(recyclerView));
- // Since this provide is based on stable ids based on whats laid out in the window
- // we can only satisfy "window" scope key access.
- super(SCOPE_CACHED);
-
- mRecyclerView = recyclerView;
-
- mRecyclerView.addOnChildAttachStateChangeListener(
- new OnChildAttachStateChangeListener() {
- @Override
- public void onChildViewAttachedToWindow(View view) {
- onAttached(view);
- }
-
- @Override
- public void onChildViewDetachedFromWindow(View view) {
- onDetached(view);
- }
- }
- );
-
+ // Adapters used w/ StableIdKeyProvider MUST have StableIds enabled.
+ checkArgument(recyclerView.getAdapter().hasStableIds(), "RecyclerView"
+ + ".Adapter#hasStableIds must return true.");
}
@SuppressWarnings("WeakerAccess") /* synthetic access */
void onAttached(@NonNull View view) {
- RecyclerView.ViewHolder holder = mRecyclerView.findContainingViewHolder(view);
+ ViewHolder holder = mHost.findViewHolder(view);
if (holder == null) {
if (DEBUG) {
Log.w(TAG, "Unable to find ViewHolder for View. Ignoring onAttached event.");
}
return;
}
- int position = holder.getAbsoluteAdapterPosition();
+ int position = mHost.getPosition(holder);
long id = holder.getItemId();
if (position != RecyclerView.NO_POSITION && id != RecyclerView.NO_ID) {
mPositionToKey.put(position, id);
@@ -94,15 +117,15 @@
}
@SuppressWarnings("WeakerAccess") /* synthetic access */
- void onDetached(@NonNull View view) {
- RecyclerView.ViewHolder holder = mRecyclerView.findContainingViewHolder(view);
+ void onRecycled(@NonNull View view) {
+ ViewHolder holder = mHost.findViewHolder(view);
if (holder == null) {
if (DEBUG) {
Log.w(TAG, "Unable to find ViewHolder for View. Ignoring onDetached event.");
}
return;
}
- int position = holder.getAbsoluteAdapterPosition();
+ int position = mHost.getPosition(holder);
long id = holder.getItemId();
if (position != RecyclerView.NO_POSITION && id != RecyclerView.NO_ID) {
mPositionToKey.delete(position);
@@ -112,6 +135,8 @@
@Override
public @Nullable Long getKey(int position) {
+ // TODO: Consider using RecyclerView.NO_ID for consistency w/ getPosition impl.
+ // Currently GridModel impl depends on null return values.
return mPositionToKey.get(position, null);
}
@@ -119,4 +144,91 @@
public int getPosition(@NonNull Long key) {
return mKeyToPosition.get(key, RecyclerView.NO_POSITION);
}
+
+ /**
+ * A wrapper interface for RecyclerView allowing for easy unit testing.
+ */
+ interface ViewHost {
+ /** Registers View{Holder} lifecycle event listener. **/
+ void registerLifecycleListener(@NonNull LifecycleListener listener);
+
+ /**
+ * Returns the ViewHolder containing {@code View}.
+ */
+ @Nullable ViewHolder findViewHolder(@NonNull View view);
+
+ /**
+ * Returns the position of the ViewHolder, or RecyclerView.NO_POSITION
+ * if unknown.
+ *
+ * This method supports testing of StableIdKeyProvider independent of
+ * a real RecyclerView instance. The correct runtime implementation is
+ * {@code return holder.getAbsoluteAdapterPosition}. This implementation
+ * depends on a concrete RecyclerView instance, which isn't test friendly
+ * given the testing approach in StableIdKeyProviderTest. Thus the
+ * introduction of this interface method allowing a test double to
+ * supply adapter position as needed to test.
+ */
+ int getPosition(@NonNull ViewHolder holder);
+
+ /** A View{Holder} lifecycle listener interface. */
+ interface LifecycleListener {
+
+ /** Called when view is attached. */
+ void onAttached(@NonNull View view);
+
+ /** Called when view is recycled. */
+ void onRecycled(@NonNull View view);
+ }
+ }
+
+ /**
+ * Implementation of ViewHost that wraps a RecyclerView instance.
+ */
+ private static class DefaultViewHost implements ViewHost {
+ private final @NonNull RecyclerView mRecyclerView;
+
+ DefaultViewHost(@NonNull RecyclerView recyclerView) {
+ checkNotNull(recyclerView);
+ mRecyclerView = recyclerView;
+ }
+
+ @Override
+ public void registerLifecycleListener(@NonNull LifecycleListener listener) {
+
+ mRecyclerView.addOnChildAttachStateChangeListener(
+ new OnChildAttachStateChangeListener() {
+ @Override
+ public void onChildViewAttachedToWindow(@NonNull View view) {
+ listener.onAttached(view);
+ }
+
+ @Override
+ public void onChildViewDetachedFromWindow(@NonNull View view) {
+ // Cached position <> key data is discarded only when
+ // a view is recycled. See b/145767095 for details.
+ }
+ }
+ );
+
+ mRecyclerView.setRecyclerListener(
+ new RecyclerListener() {
+ @Override
+ public void onViewRecycled(@NonNull ViewHolder holder) {
+ listener.onRecycled(holder.itemView);
+ }
+ }
+ );
+ }
+
+ @Override
+ public @Nullable ViewHolder findViewHolder(@NonNull View view) {
+ return mRecyclerView.findContainingViewHolder(view);
+ }
+
+ @Override
+ public int getPosition(@NonNull ViewHolder holder) {
+ return holder.getAbsoluteAdapterPosition();
+ }
+ }
}
diff --git a/samples/Support7Demos/src/main/AndroidManifest.xml b/samples/Support7Demos/src/main/AndroidManifest.xml
index 13a7051..551f5b6 100644
--- a/samples/Support7Demos/src/main/AndroidManifest.xml
+++ b/samples/Support7Demos/src/main/AndroidManifest.xml
@@ -746,6 +746,16 @@
</activity>
<!-- Selection helper demo activity -->
+ <activity android:name=".widget.selection.single.SingleStableIdSelectionDemoActivity"
+ android:label="@string/single_selection_demo_activity"
+ android:theme="@style/Theme.AppCompat.Light">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="com.example.android.supportv7.SAMPLE_CODE"/>
+ </intent-filter>
+ </activity>
+
+ <!-- Selection helper demo activity -->
<activity android:name=".widget.selection.simple.SimpleSelectionDemoActivity"
android:label="@string/simple_selection_demo_activity"
android:theme="@style/Theme.AppCompat.Light">
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoAdapter.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoAdapter.java
similarity index 83%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoAdapter.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoAdapter.java
index 804e7ec..c0016e9 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoAdapter.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoAdapter.java
@@ -36,7 +36,7 @@
import java.util.HashMap;
import java.util.Map;
-final class FancySelectionDemoAdapter extends RecyclerView.Adapter<FancyHolder> {
+final class DemoAdapter extends RecyclerView.Adapter<DemoHolder> {
public static final int TYPE_HEADER = 1;
public static final int TYPE_ITEM = 2;
@@ -54,7 +54,7 @@
}
};
- FancySelectionDemoAdapter(Context context) {
+ DemoAdapter(Context context) {
mContext = context;
mKeyProvider = new KeyProvider("cheeses", Cheeses.sCheeseStrings);
@@ -98,13 +98,13 @@
}
@Override
- public void onBindViewHolder(@NonNull FancyHolder holder, int position) {
- if (holder instanceof FancyHeaderHolder) {
+ public void onBindViewHolder(@NonNull DemoHolder holder, int position) {
+ if (holder instanceof DemoHeaderHolder) {
Uri uri = mKeyProvider.getKey(position);
- ((FancyHeaderHolder) holder).update(uri.getPathSegments().get(0));
- } else if (holder instanceof FancyItemHolder) {
+ ((DemoHeaderHolder) holder).update(uri.getPathSegments().get(0));
+ } else if (holder instanceof DemoItemHolder) {
Uri uri = mKeyProvider.getKey(position);
- ((FancyItemHolder) holder).update(uri, uri.getPathSegments().get(1),
+ ((DemoItemHolder) holder).update(uri, uri.getPathSegments().get(1),
mSelTest.isSelected(uri));
}
}
@@ -122,13 +122,13 @@
}
@Override
- public FancyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ public DemoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
switch (viewType) {
case TYPE_HEADER:
- return new FancyHeaderHolder(
+ return new DemoHeaderHolder(
inflateLayout(mContext, parent, R.layout.selection_demo_list_header));
case TYPE_ITEM:
- return new FancyItemHolder(
+ return new DemoItemHolder(
inflateLayout(mContext, parent, R.layout.selection_demo_list_item));
}
throw new RuntimeException("Unsupported view type" + viewType);
@@ -145,7 +145,19 @@
boolean isSelected(Uri id);
}
- private static final class KeyProvider extends ItemKeyProvider<Uri> {
+ /**
+ * When ever possible provide the selection library with a
+ * "SCOPED_MAPPED" ItemKeyProvider. This enables the selection
+ * library to provide ChromeOS friendly features such as mouse-driven
+ * band selection.
+ *
+ * Background: SCOPED_MAPPED providers allow the library to access
+ * an item's key or position independently of how the data is
+ * represented in the RecyclerView. This is useful in that it
+ * allows the library to operate on items that are not currently laid
+ * out in RecyclerView.
+ */
+ static final class KeyProvider extends ItemKeyProvider<Uri> {
private final Uri[] mUris;
private final Map<Uri, Integer> mPositions;
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoDetailsLookup.java
similarity index 87%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoDetailsLookup.java
index c2d57f0..eaf1dfd 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoDetailsLookup.java
@@ -28,11 +28,11 @@
/**
* Access to details of an item associated with a {@link MotionEvent} instance.
*/
-final class FancyDetailsLookup extends ItemDetailsLookup<Uri> {
+final class DemoDetailsLookup extends ItemDetailsLookup<Uri> {
private final RecyclerView mRecView;
- FancyDetailsLookup(RecyclerView view) {
+ DemoDetailsLookup(RecyclerView view) {
mRecView = view;
}
@@ -41,8 +41,8 @@
@Nullable View view = mRecView.findChildViewUnder(e.getX(), e.getY());
if (view != null) {
ViewHolder holder = mRecView.getChildViewHolder(view);
- if (holder instanceof FancyItemHolder) {
- return ((FancyItemHolder) holder).getItemDetails();
+ if (holder instanceof DemoItemHolder) {
+ return ((DemoItemHolder) holder).getItemDetails();
}
// FancyHeaderHolder doesn't hold a selectable item,
// so it doesn't support getItemDetails.
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHeaderHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHeaderHolder.java
similarity index 93%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHeaderHolder.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHeaderHolder.java
index 4ed2d1f..24f73ca 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHeaderHolder.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHeaderHolder.java
@@ -21,12 +21,12 @@
import com.example.android.supportv7.R;
-final class FancyHeaderHolder extends FancyHolder {
+final class DemoHeaderHolder extends DemoHolder {
private static final String HEADER_TAG = "I'm a header";
public final TextView mLabel;
- FancyHeaderHolder(LinearLayout layout) {
+ DemoHeaderHolder(LinearLayout layout) {
super(layout);
layout.setTag(HEADER_TAG);
mLabel = layout.findViewById(R.id.label);
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHolder.java
similarity index 88%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHolder.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHolder.java
index 6fbc206..0c6b999 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyHolder.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoHolder.java
@@ -20,8 +20,8 @@
import androidx.recyclerview.widget.RecyclerView;
-abstract class FancyHolder extends RecyclerView.ViewHolder {
- FancyHolder(LinearLayout layout) {
+abstract class DemoHolder extends RecyclerView.ViewHolder {
+ DemoHolder(LinearLayout layout) {
super(layout);
}
}
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoItemHolder.java
similarity index 90%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoItemHolder.java
index 944e200..176fb3d 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/DemoItemHolder.java
@@ -27,7 +27,7 @@
import com.example.android.supportv7.R;
-final class FancyItemHolder extends FancyHolder {
+final class DemoItemHolder extends DemoHolder {
private final LinearLayout mContainer;
private final TextView mSelector;
@@ -36,7 +36,7 @@
private @Nullable Uri mKey;
- FancyItemHolder(LinearLayout layout) {
+ DemoItemHolder(LinearLayout layout) {
super(layout);
mContainer = layout.findViewById(R.id.container);
@@ -45,28 +45,28 @@
mDetails = new ItemDetails<Uri>() {
@Override
public int getPosition() {
- return FancyItemHolder.this.getBindingAdapterPosition();
+ return DemoItemHolder.this.getAbsoluteAdapterPosition();
}
@Override
public Uri getSelectionKey() {
- return FancyItemHolder.this.mKey;
+ return DemoItemHolder.this.mKey;
}
@Override
public boolean inDragRegion(@NonNull MotionEvent e) {
- return FancyItemHolder.this.inDragRegion(e);
+ return DemoItemHolder.this.inDragRegion(e);
}
@Override
public boolean inSelectionHotspot(@NonNull MotionEvent e) {
- return FancyItemHolder.this.inSelectRegion(e);
+ return DemoItemHolder.this.inSelectRegion(e);
}
@NonNull
@Override
public String toString() {
- return FancyItemHolder.this.toString();
+ return DemoItemHolder.this.toString();
}
};
}
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java
index 38e0046..ba3a945 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancySelectionDemoActivity.java
@@ -45,19 +45,29 @@
import com.example.android.supportv7.R;
/**
- * ContentPager demo activity.
+ * RecyclerView Selection library fancy demo activity. The fancy
+ * demo includes support for both touch and mouse (band) driven selection.
+ * Use this activity as your example when implementing an activity/fragment
+ * that will run on a wide range of devices, including devices like ChromeOS
+ * where a pointing device may be present, or even the sole means of input.
+ *
+ * <p>The key to an implementation that provides mouse support is
+ * to provide an {@link ItemKeyProvider} that is
+ * {@link ItemKeyProvider#SCOPE_MAPPED}. This means the key provider
+ * can supply information about both position and item key at any time,
+ * even when an item is not attached to the recycler view. See
+ * {@link DemoAdapter.KeyProvider} for an example of a SCOPE_MAPPED
+ * provider that uses simple {@link Uri}s as the keys.
*/
public class FancySelectionDemoActivity extends AppCompatActivity {
private static final String TAG = "SelectionDemos";
- private static final String EXTRA_COLUMN_COUNT = "demo-column-count";
private RecyclerView mRecView;
- private FancySelectionDemoAdapter mAdapter;
+ private DemoAdapter mAdapter;
private SelectionTracker<Uri> mSelectionTracker;
private GridLayoutManager mLayout;
- private int mColumnCount = 1; // This will get updated when layout changes.
private boolean mIterceptListenerEnabled = false;
@Override
@@ -80,7 +90,7 @@
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
return mIterceptListenerEnabled
- && FancyHeaderHolder.isHeader(rv.findChildViewUnder(e.getX(), e.getY()));
+ && DemoHeaderHolder.isHeader(rv.findChildViewUnder(e.getX(), e.getY()));
}
@Override
@@ -93,9 +103,9 @@
}
});
- mLayout = new GridLayoutManager(this, mColumnCount);
+ mLayout = new GridLayoutManager(this, 1);
mRecView.setLayoutManager(mLayout);
- mAdapter = new FancySelectionDemoAdapter(this);
+ mAdapter = new DemoAdapter(this);
mRecView.setAdapter(mAdapter);
ItemKeyProvider<Uri> keyProvider = mAdapter.getItemKeyProvider();
@@ -103,18 +113,25 @@
"fancy-demo",
mRecView,
keyProvider,
- new FancyDetailsLookup(mRecView),
+ new DemoDetailsLookup(mRecView),
StorageStrategy.createParcelableStorage(Uri.class));
- // Override default behaviors and build in multi select mode.
- // Call .withSelectionPredicate(SelectionTracker.SelectionPredicate.SINGLE_ANYTHING)
- // for single selection mode.
+ // Build a multi-selection enabled tracker with support for many
+ // mouse/keyboard centric niceties friendly to ChromeOS users
+ // of your app.
mSelectionTracker = builder
.withSelectionPredicate(SelectionPredicates.createSelectAnything())
+ // Allow users to drag a selection, can be initiated by long pressing
+ // on existing selection, or click-dragging with a mouse.
.withOnDragInitiatedListener(new OnDragInitiatedListener(this))
+ // Respond to context clicks allows you to add options for mouse users.
.withOnContextClickListener(new OnContextClickListener())
.withOnItemActivatedListener(new OnItemActivatedListener(this))
+ // Keep track of item focus which can aid in creating desirable
+ // keyboard based experiences for users on laptops.
.withFocusDelegate(new FocusDelegate())
+ // Use a custom band overlay when mouse selection is active.
+ // The library provides a default resource.
.withBandOverlay(R.drawable.selection_demo_band_overlay)
.build();
@@ -139,18 +156,10 @@
protected void onSaveInstanceState(@NonNull Bundle state) {
super.onSaveInstanceState(state);
mSelectionTracker.onSaveInstanceState(state);
- state.putInt(EXTRA_COLUMN_COUNT, mColumnCount);
}
private void updateFromSavedState(Bundle state) {
mSelectionTracker.onRestoreInstanceState(state);
-
- if (state != null) {
- if (state.containsKey(EXTRA_COLUMN_COUNT)) {
- mColumnCount = state.getInt(EXTRA_COLUMN_COUNT);
- mLayout.setSpanCount(mColumnCount);
- }
- }
}
@Override
@@ -172,7 +181,7 @@
}
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
+ public boolean onOptionsItemSelected(@NonNull MenuItem item) {
mIterceptListenerEnabled = !mIterceptListenerEnabled;
return true;
}
@@ -276,7 +285,7 @@
}
@Override
- public boolean onItemActivated(ItemDetails<Uri> item, MotionEvent e) {
+ public boolean onItemActivated(@NonNull ItemDetails<Uri> item, @NonNull MotionEvent e) {
toast(mContext, "Activate item: " + item);
return true;
}
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java
similarity index 95%
rename from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java
rename to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java
index 5ca576d..c4853bd 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoAdapter.java
@@ -32,7 +32,7 @@
import com.example.android.supportv7.Cheeses;
import com.example.android.supportv7.R;
-final class SimpleSelectionDemoAdapter extends RecyclerView.Adapter<DemoHolder> {
+final class DemoAdapter extends RecyclerView.Adapter<DemoHolder> {
private static final String TAG = "SelectionDemos";
private final Context mContext;
@@ -41,7 +41,7 @@
// asks SelectionTracker.
private SelectionTest mSelTest;
- SimpleSelectionDemoAdapter(Context context) {
+ DemoAdapter(Context context) {
mContext = context;
mSelTest = id -> {
throw new IllegalStateException(
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java
index 9edbdd8..ab0ffa8 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/DemoHolder.java
@@ -41,7 +41,7 @@
mDetails = new ItemDetails<Long>() {
@Override
public int getPosition() {
- return DemoHolder.this.getBindingAdapterPosition();
+ return DemoHolder.this.getAbsoluteAdapterPosition();
}
@Override
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java
index 63fda61..d946c27 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoActivity.java
@@ -22,6 +22,7 @@
import android.view.MotionEvent;
import android.widget.Toast;
+import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
import androidx.recyclerview.selection.ItemKeyProvider;
@@ -36,18 +37,15 @@
import com.example.android.supportv7.R;
/**
- * ContentPager demo activity.
+ * RecyclerView Selection library simple demo activity.
*/
public class SimpleSelectionDemoActivity extends AppCompatActivity {
private static final String TAG = "SelectionDemos";
- private static final String EXTRA_COLUMN_COUNT = "demo-column-count";
- private SimpleSelectionDemoAdapter mAdapter;
+ private DemoAdapter mAdapter;
private SelectionTracker<Long> mSelectionTracker;
-
private GridLayoutManager mLayout;
- private int mColumnCount = 1; // This will get updated when layout changes.
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -56,13 +54,10 @@
setContentView(R.layout.selection_demo_layout);
RecyclerView recView = findViewById(R.id.list);
- // keyProvider depends on mAdapter.setHasStableIds(true).
- ItemKeyProvider<Long> keyProvider = new StableIdKeyProvider(recView);
-
- mLayout = new GridLayoutManager(this, mColumnCount);
+ mLayout = new GridLayoutManager(this, 1);
recView.setLayoutManager(mLayout);
- mAdapter = new SimpleSelectionDemoAdapter(this);
+ mAdapter = new DemoAdapter(this);
// The adapter is paired with a key provider that supports
// the native RecyclerView stableId. For this to work correctly
// the adapter must report that it supports stable ids.
@@ -70,6 +65,9 @@
recView.setAdapter(mAdapter);
+ // keyProvider depends on mAdapter.setHasStableIds(true).
+ ItemKeyProvider<Long> keyProvider = new StableIdKeyProvider(recView);
+
SelectionTracker.Builder<Long> builder = new SelectionTracker.Builder<>(
"simple-demo",
recView,
@@ -77,16 +75,9 @@
new DemoDetailsLookup(recView),
StorageStrategy.createLongStorage());
- // Override default behaviors and build in multi select mode.
- // Call .withSelectionPredicate(SelectionTracker.SelectionPredicate.SINGLE_ANYTHING)
- // for single selection mode.
mSelectionTracker = builder
.withSelectionPredicate(SelectionPredicates.createSelectAnything())
- .withOnDragInitiatedListener(new OnDragInitiatedListener(this))
- .withOnContextClickListener(new OnContextClickListener(this))
.withOnItemActivatedListener(new OnItemActivatedListener(this))
- .withFocusDelegate(new FocusDelegate(this))
- .withBandOverlay(R.drawable.selection_demo_band_overlay)
.build();
// Lazily bind SelectionTracker. Allows us to defer initialization of the
@@ -107,21 +98,13 @@
}
@Override
- protected void onSaveInstanceState(Bundle state) {
+ protected void onSaveInstanceState(@NonNull Bundle state) {
super.onSaveInstanceState(state);
mSelectionTracker.onSaveInstanceState(state);
- state.putInt(EXTRA_COLUMN_COUNT, mColumnCount);
}
private void updateFromSavedState(Bundle state) {
mSelectionTracker.onRestoreInstanceState(state);
-
- if (state != null) {
- if (state.containsKey(EXTRA_COLUMN_COUNT)) {
- mColumnCount = state.getInt(EXTRA_COLUMN_COUNT);
- mLayout.setSpanCount(mColumnCount);
- }
- }
}
@Override
@@ -161,73 +144,9 @@
}
@Override
- public boolean onItemActivated(ItemDetails<Long> item, MotionEvent e) {
+ public boolean onItemActivated(@NonNull ItemDetails<Long> item, @NonNull MotionEvent e) {
toast(mContext, "Activate item: " + item.getSelectionKey());
return true;
}
}
-
- private static final class FocusDelegate extends
- androidx.recyclerview.selection.FocusDelegate<Long> {
-
- private final Context mContext;
-
- private FocusDelegate(Context context) {
- mContext = context;
- }
-
- @Override
- public void focusItem(ItemDetails<Long> item) {
- toast(mContext, "Focused item: " + item.getSelectionKey());
- }
-
- @Override
- public boolean hasFocusedItem() {
- return false;
- }
-
- @Override
- public int getFocusedPosition() {
- return 0;
- }
-
- @Override
- public void clearFocus() {
- toast(mContext, "Cleared focus.");
- }
- }
-
- // Implementation of MouseInputHandler.Callbacks allows handling
- // of higher level events, like onActivated.
- private static final class OnContextClickListener implements
- androidx.recyclerview.selection.OnContextClickListener {
-
- private final Context mContext;
-
- OnContextClickListener(Context context) {
- mContext = context;
- }
-
- @Override
- public boolean onContextClick(MotionEvent e) {
- toast(mContext, "Context click received.");
- return true;
- }
- };
-
- private static final class OnDragInitiatedListener implements
- androidx.recyclerview.selection.OnDragInitiatedListener {
-
- private final Context mContext;
-
- private OnDragInitiatedListener(Context context) {
- mContext = context;
- }
-
- @Override
- public boolean onDragInitiated(MotionEvent e) {
- toast(mContext, "onDragInitiated received.");
- return true;
- }
- }
}
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoAdapter.java
similarity index 93%
copy from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java
copy to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoAdapter.java
index 5ca576d..b56858d 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/simple/SimpleSelectionDemoAdapter.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoAdapter.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package com.example.android.supportv7.widget.selection.simple;
+package com.example.android.supportv7.widget.selection.single;
import static androidx.core.util.Preconditions.checkArgument;
@@ -32,7 +32,7 @@
import com.example.android.supportv7.Cheeses;
import com.example.android.supportv7.R;
-final class SimpleSelectionDemoAdapter extends RecyclerView.Adapter<DemoHolder> {
+final class DemoAdapter extends RecyclerView.Adapter<DemoHolder> {
private static final String TAG = "SelectionDemos";
private final Context mContext;
@@ -41,7 +41,7 @@
// asks SelectionTracker.
private SelectionTest mSelTest;
- SimpleSelectionDemoAdapter(Context context) {
+ DemoAdapter(Context context) {
mContext = context;
mSelTest = id -> {
throw new IllegalStateException(
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java
similarity index 72%
copy from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java
copy to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java
index c2d57f0..af40460 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyDetailsLookup.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoDetailsLookup.java
@@ -13,9 +13,8 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.android.supportv7.widget.selection.single;
-import android.net.Uri;
import android.view.MotionEvent;
import android.view.View;
@@ -28,24 +27,22 @@
/**
* Access to details of an item associated with a {@link MotionEvent} instance.
*/
-final class FancyDetailsLookup extends ItemDetailsLookup<Uri> {
+final class DemoDetailsLookup extends ItemDetailsLookup<Long> {
private final RecyclerView mRecView;
- FancyDetailsLookup(RecyclerView view) {
+ DemoDetailsLookup(RecyclerView view) {
mRecView = view;
}
@Override
- public ItemDetails<Uri> getItemDetails(@NonNull MotionEvent e) {
+ public ItemDetails<Long> getItemDetails(@NonNull MotionEvent e) {
@Nullable View view = mRecView.findChildViewUnder(e.getX(), e.getY());
if (view != null) {
ViewHolder holder = mRecView.getChildViewHolder(view);
- if (holder instanceof FancyItemHolder) {
- return ((FancyItemHolder) holder).getItemDetails();
+ if (holder instanceof DemoHolder) {
+ return ((DemoHolder) holder).getItemDetails();
}
- // FancyHeaderHolder doesn't hold a selectable item,
- // so it doesn't support getItemDetails.
}
return null;
}
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java
similarity index 73%
copy from samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java
copy to samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java
index 944e200..d92eef9 100644
--- a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/fancy/FancyItemHolder.java
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/DemoHolder.java
@@ -13,66 +13,55 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.example.android.supportv7.widget.selection.fancy;
+package com.example.android.supportv7.widget.selection.single;
import android.graphics.Rect;
-import android.net.Uri;
import android.view.MotionEvent;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.recyclerview.selection.ItemDetailsLookup.ItemDetails;
+import androidx.recyclerview.widget.RecyclerView;
import com.example.android.supportv7.R;
-final class FancyItemHolder extends FancyHolder {
+final class DemoHolder extends RecyclerView.ViewHolder {
private final LinearLayout mContainer;
private final TextView mSelector;
private final TextView mLabel;
- private final ItemDetails<Uri> mDetails;
+ private final ItemDetails<Long> mDetails;
- private @Nullable Uri mKey;
-
- FancyItemHolder(LinearLayout layout) {
+ DemoHolder(LinearLayout layout) {
super(layout);
-
mContainer = layout.findViewById(R.id.container);
mSelector = layout.findViewById(R.id.selector);
mLabel = layout.findViewById(R.id.label);
- mDetails = new ItemDetails<Uri>() {
+ mDetails = new ItemDetails<Long>() {
@Override
public int getPosition() {
- return FancyItemHolder.this.getBindingAdapterPosition();
+ return DemoHolder.this.getAbsoluteAdapterPosition();
}
@Override
- public Uri getSelectionKey() {
- return FancyItemHolder.this.mKey;
+ public Long getSelectionKey() {
+ return DemoHolder.this.getItemId();
}
@Override
public boolean inDragRegion(@NonNull MotionEvent e) {
- return FancyItemHolder.this.inDragRegion(e);
+ return DemoHolder.this.inDragRegion(e);
}
@Override
public boolean inSelectionHotspot(@NonNull MotionEvent e) {
- return FancyItemHolder.this.inSelectRegion(e);
- }
-
- @NonNull
- @Override
- public String toString() {
- return FancyItemHolder.this.toString();
+ return DemoHolder.this.inSelectRegion(e);
}
};
}
- void update(Uri key, String label, boolean selected) {
- mKey = key;
+ void update(String label, boolean selected) {
mLabel.setText(label);
setSelected(selected);
}
@@ -112,12 +101,7 @@
return iconRect.contains((int) e.getRawX(), (int) e.getRawY());
}
- ItemDetails<Uri> getItemDetails() {
+ ItemDetails<Long> getItemDetails() {
return mDetails;
}
-
- @Override
- public String toString() {
- return "Item{name:" + mLabel.getText() + ", url:" + mKey + "}";
- }
}
diff --git a/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/SingleStableIdSelectionDemoActivity.java b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/SingleStableIdSelectionDemoActivity.java
new file mode 100644
index 0000000..702768b
--- /dev/null
+++ b/samples/Support7Demos/src/main/java/com/example/android/supportv7/widget/selection/single/SingleStableIdSelectionDemoActivity.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2017 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.example.android.supportv7.widget.selection.single;
+
+import android.os.Bundle;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.recyclerview.selection.SelectionPredicates;
+import androidx.recyclerview.selection.SelectionTracker;
+import androidx.recyclerview.selection.SelectionTracker.SelectionObserver;
+import androidx.recyclerview.selection.StableIdKeyProvider;
+import androidx.recyclerview.selection.StorageStrategy;
+import androidx.recyclerview.widget.GridLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.example.android.supportv7.R;
+
+/**
+ * RecyclerView Selection library single-selection mode demo activity.
+ */
+public class SingleStableIdSelectionDemoActivity extends AppCompatActivity {
+
+ private static final String TAG = "SelectionDemos";
+
+ private DemoAdapter mAdapter;
+ private SelectionTracker<Long> mSelectionTracker;
+ private GridLayoutManager mLayout;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.selection_demo_layout);
+ RecyclerView recView = findViewById(R.id.list);
+
+ mLayout = new GridLayoutManager(this, 1);
+ recView.setLayoutManager(mLayout);
+
+ mAdapter = new DemoAdapter(this);
+
+ // For StableIdKeyProvider (used below) to work correctly the adapter must
+ // have stable ids enabled.
+ mAdapter.setHasStableIds(true);
+
+ recView.setAdapter(mAdapter);
+
+ SelectionTracker.Builder<Long> builder = new SelectionTracker.Builder<>(
+ "single-stableid-demo",
+ recView,
+ new StableIdKeyProvider(recView),
+ new DemoDetailsLookup(recView),
+ StorageStrategy.createLongStorage());
+
+ mSelectionTracker = builder
+ // Can a single item.
+ .withSelectionPredicate(SelectionPredicates.createSelectSingleAnything())
+ .build();
+
+ // Lazily bind SelectionTracker. Allows us to defer initialization of the
+ // SelectionTracker dependency until after the adapter is created.
+ mAdapter.bindSelectionHelper(mSelectionTracker);
+
+ // TODO: Glue selection to ActionMode, since that'll be a common practice.
+ mSelectionTracker.addObserver(
+ new SelectionObserver<Long>() {
+ @Override
+ public void onSelectionChanged() {
+ Log.i(TAG, "Selection changed to: " + mSelectionTracker.getSelection());
+ }
+ });
+
+ // Restore selection from saved state.
+ updateFromSavedState(savedInstanceState);
+ }
+
+ @Override
+ protected void onSaveInstanceState(@NonNull Bundle state) {
+ super.onSaveInstanceState(state);
+ mSelectionTracker.onSaveInstanceState(state);
+ }
+
+ private void updateFromSavedState(Bundle state) {
+ mSelectionTracker.onRestoreInstanceState(state);
+ }
+
+ @Override
+ public void onBackPressed() {
+ if (mSelectionTracker.clearSelection()) {
+ return;
+ } else {
+ super.onBackPressed();
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ mSelectionTracker.clearSelection();
+ super.onDestroy();
+ }
+
+ @Override
+ protected void onStart() {
+ super.onStart();
+ mAdapter.loadData();
+ }
+}
diff --git a/samples/Support7Demos/src/main/res/values/strings.xml b/samples/Support7Demos/src/main/res/values/strings.xml
index e467c89..4411d75 100644
--- a/samples/Support7Demos/src/main/res/values/strings.xml
+++ b/samples/Support7Demos/src/main/res/values/strings.xml
@@ -269,6 +269,7 @@
<string name="appcompat_vector_title">AppCompat/Integrations/AnimatedVectorDrawable</string>
<string name="appcompat_animated_selector_title">AppCompat/Integrations/AnimatedStateListDrawable</string>
+ <string name="single_selection_demo_activity">RecyclerView-Selection: Single Select</string>
<string name="simple_selection_demo_activity">RecyclerView Selection: Gesture Only</string>
<string name="fancy_selection_demo_activity">RecyclerView Selection: Gesture and Pointer</string>
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/OnPositionedBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/OnPositionedBenchmark.kt
index db48874..1cc3fc9 100644
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/OnPositionedBenchmark.kt
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/OnPositionedBenchmark.kt
@@ -16,20 +16,21 @@
package androidx.compose.ui
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.ContentGravity
+import androidx.compose.foundation.layout.Stack
+import androidx.compose.foundation.layout.preferredSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
import androidx.test.filters.LargeTest
import androidx.ui.benchmark.ComposeBenchmarkRule
import androidx.ui.benchmark.toggleStateBenchmarkLayout
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.ContentGravity
import androidx.ui.integration.test.ToggleableTestCase
-import androidx.compose.foundation.layout.Stack
-import androidx.compose.foundation.layout.preferredSize
import androidx.ui.test.ComposeTestCase
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.dp
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -57,7 +58,7 @@
@Composable
override fun emitContent() {
- val size = state { 200.dp }
+ val size = remember { mutableStateOf(200.dp) }
this.state = size
Stack {
Box(Modifier.preferredSize(size.value), gravity = ContentGravity.Center) {
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/WithConstraintsBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/WithConstraintsBenchmark.kt
index 26f9a82..f881f47 100644
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/WithConstraintsBenchmark.kt
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/compose/ui/WithConstraintsBenchmark.kt
@@ -16,25 +16,26 @@
package androidx.compose.ui
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.ContentGravity
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.preferredSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
import androidx.test.filters.LargeTest
import androidx.ui.benchmark.ComposeBenchmarkRule
import androidx.ui.benchmark.toggleStateBenchmarkComposeMeasureLayout
import androidx.ui.benchmark.toggleStateBenchmarkMeasureLayout
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.ContentGravity
import androidx.ui.integration.test.ToggleableTestCase
-import androidx.compose.foundation.layout.Spacer
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.preferredSize
-import androidx.compose.ui.unit.Constraints
import androidx.ui.test.ComposeTestCase
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.unit.dp
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -69,7 +70,7 @@
@Composable
override fun emitContent() {
- val size = state { 200.dp }
+ val size = remember { mutableStateOf(200.dp) }
this.state = size
Box(Modifier.preferredSize(300.dp), gravity = ContentGravity.Center) {
Spacer(Modifier.preferredSize(width = size.value, height = size.value))
@@ -87,7 +88,7 @@
@Composable
override fun emitContent() {
- val size = state { 200.dp }
+ val size = remember { mutableStateOf(200.dp) }
this.state = size
WithConstraints {
Box(Modifier.preferredSize(300.dp), gravity = ContentGravity.Center) {
@@ -107,7 +108,7 @@
@Composable
override fun emitContent() {
- val size = state { 100 }
+ val size = remember { mutableStateOf(100) }
this.state = size
ChangingConstraintsLayout(state) {
WithConstraints {
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt
index 96d2d67f..d4468a8 100644
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/SpacingBenchmark.kt
@@ -16,9 +16,17 @@
package androidx.ui.benchmark.test
+import androidx.compose.foundation.layout.InnerPadding
+import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.offset
import androidx.test.filters.LargeTest
import androidx.ui.benchmark.ComposeBenchmarkRule
import androidx.ui.benchmark.benchmarkDrawPerf
@@ -31,15 +39,8 @@
import androidx.ui.benchmark.toggleStateBenchmarkLayout
import androidx.ui.benchmark.toggleStateBenchmarkMeasure
import androidx.ui.benchmark.toggleStateBenchmarkRecompose
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
import androidx.ui.integration.test.ToggleableTestCase
-import androidx.compose.foundation.layout.InnerPadding
-import androidx.compose.foundation.layout.padding
import androidx.ui.test.ComposeTestCase
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.offset
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -168,7 +169,7 @@
@Composable
override fun emitContent() {
- val padding = state { 5.dp }
+ val padding = remember { mutableStateOf(5.dp) }
paddingState = padding
FillerContainer {
diff --git a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/TrailingLambdaBenchmark.kt b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/TrailingLambdaBenchmark.kt
index 297b453..df185ec 100644
--- a/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/TrailingLambdaBenchmark.kt
+++ b/ui/integration-tests/benchmark/src/androidTest/java/androidx/ui/benchmark/test/TrailingLambdaBenchmark.kt
@@ -16,20 +16,21 @@
package androidx.ui.benchmark.test
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.preferredWidth
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
import androidx.test.filters.LargeTest
import androidx.ui.benchmark.ComposeBenchmarkRule
import androidx.ui.benchmark.benchmarkFirstCompose
import androidx.ui.benchmark.toggleStateBenchmarkRecompose
-import androidx.compose.ui.Modifier
-import androidx.compose.foundation.Box
import androidx.ui.integration.test.ToggleableTestCase
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.preferredWidth
import androidx.ui.test.ComposeTestCase
-import androidx.compose.ui.unit.dp
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -69,7 +70,7 @@
@Composable
override fun emitContent() {
- val number = state { 5 }
+ val number = remember { mutableStateOf(5) }
numberState = number
val content = @Composable {
diff --git a/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt b/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt
index c5f386d..e24325c 100644
--- a/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt
+++ b/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/ObservableThemeTest.kt
@@ -24,14 +24,13 @@
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.runtime.staticAmbientOf
import androidx.compose.runtime.structuralEqualityPolicy
import androidx.compose.ui.graphics.Color
import androidx.test.filters.MediumTest
-import androidx.ui.test.assertNoPendingChanges
import androidx.ui.test.ComposeTestCase
import androidx.ui.test.ExperimentalTesting
+import androidx.ui.test.assertNoPendingChanges
import androidx.ui.test.createComposeRule
import androidx.ui.test.doFramesUntilNoChangesPending
import org.junit.Assert
@@ -109,7 +108,7 @@
@Composable
override fun emitContent() {
- val primary = state { Color.Red }
+ val primary = remember { mutableStateOf(Color.Red) }
primaryState = primary
val palette = createTheme(primary.value)
diff --git a/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/BaseSimpleRadioButtonTestCase.kt b/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/BaseSimpleRadioButtonTestCase.kt
index 6611f3b..460c749 100644
--- a/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/BaseSimpleRadioButtonTestCase.kt
+++ b/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/BaseSimpleRadioButtonTestCase.kt
@@ -18,11 +18,12 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
-import androidx.ui.test.ComposeTestCase
import androidx.ui.integration.test.ToggleableTestCase
+import androidx.ui.test.ComposeTestCase
abstract class BaseSimpleRadioButtonTestCase : ComposeTestCase, ToggleableTestCase {
@@ -30,7 +31,7 @@
@Composable
fun getInnerSize(): MutableState<Dp> {
- val innerSize = state { 10.dp }
+ val innerSize = remember { mutableStateOf(10.dp) }
state = innerSize
return innerSize
}
diff --git a/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/RectsInColumnTestCase.kt b/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/RectsInColumnTestCase.kt
index fa02d42..97395cb 100644
--- a/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/RectsInColumnTestCase.kt
+++ b/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/RectsInColumnTestCase.kt
@@ -16,20 +16,21 @@
package androidx.ui.integration.test.foundation
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Box
import androidx.compose.foundation.background
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.preferredSize
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
-import androidx.ui.test.ComposeTestCase
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
import androidx.ui.integration.test.ToggleableTestCase
-import androidx.compose.foundation.layout.preferredSize
+import androidx.ui.test.ComposeTestCase
/**
* Test case that puts the given amount of rectangles into a column layout and makes changes by
@@ -67,7 +68,7 @@
@Composable
fun ColoredRectWithModel() {
- val state = state { Color.Black }
+ val state = remember { mutableStateOf(Color.Black) }
states.add(state)
Box(Modifier.preferredSize(100.dp, 50.dp).background(color = state.value))
}
diff --git a/ui/integration-tests/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt b/ui/integration-tests/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt
index b5bc75e..34ae215 100644
--- a/ui/integration-tests/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt
+++ b/ui/integration-tests/src/main/java/androidx/ui/integration/test/material/CheckboxesInRowsTestCase.kt
@@ -16,19 +16,20 @@
package androidx.ui.integration.test.material
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Text
-import androidx.ui.integration.test.ToggleableTestCase
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material.Checkbox
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.ui.integration.test.ToggleableTestCase
import androidx.ui.test.ComposeTestCase
/**
@@ -66,7 +67,7 @@
@Composable
fun CheckboxWithState(modifier: Modifier = Modifier) {
- val state = state { false }
+ val state = remember { mutableStateOf(false) }
states.add(state)
Checkbox(
checked = state.value,
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComplexInteractions.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComplexInteractions.kt
index 77b8b91..8b84ced 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComplexInteractions.kt
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComplexInteractions.kt
@@ -20,26 +20,27 @@
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.widget.FrameLayout
import android.widget.RelativeLayout
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Recomposer
import androidx.compose.foundation.Box
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.setContent
-import androidx.ui.demos.common.ComposableDemo
-import androidx.ui.demos.common.DemoCategory
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.material.Button
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.ContextAmbient
+import androidx.compose.ui.platform.setContent
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
+import androidx.ui.demos.common.ComposableDemo
+import androidx.ui.demos.common.DemoCategory
// TODO(b/158099918): Add this demo to AndroidViewDemos.kt once b/158099918 has been resolved.
@Suppress("unused")
@@ -105,7 +106,7 @@
@Composable
fun colorButton() {
- val state = state { false }
+ val state = remember { mutableStateOf(false) }
val color =
if (state.value) {
Color.Red
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt
index 0519f73..f32522d 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt
@@ -20,16 +20,10 @@
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
-import androidx.compose.runtime.Composable
-import androidx.ui.androidview.adapters.setOnClick
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
import androidx.compose.foundation.Box
import androidx.compose.foundation.ScrollableColumn
import androidx.compose.foundation.ScrollableRow
import androidx.compose.foundation.Text
-import androidx.compose.ui.geometry.Offset
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -38,13 +32,20 @@
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.tapGestureFilter
import androidx.compose.ui.input.pointer.pointerInteropFilter
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.viewinterop.AndroidView
+import androidx.ui.androidview.adapters.setOnClick
import androidx.ui.demos.common.ComposableDemo
import androidx.ui.demos.common.DemoCategory
-import androidx.compose.ui.viewinterop.AndroidView
val AndroidInComposeDemos = DemoCategory("Android In Compose Interop", listOf(
ComposableDemo("4 Android tap in Compose") { FourAndroidTapInCompose() },
@@ -276,7 +277,7 @@
@Composable
private fun PointerInteropFilterDemo() {
- val motionEventString: MutableState<String> = state { "Touch here!" }
+ val motionEventString: MutableState<String> = remember { mutableStateOf("Touch here!") }
Column {
Text("Demonstrates the functionality of pointerInteropFilter.")
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropComposeInAndroid.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropComposeInAndroid.kt
index 3b8934c..3a3602f 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropComposeInAndroid.kt
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropComposeInAndroid.kt
@@ -22,23 +22,11 @@
import android.view.ViewGroup
import android.widget.TextView
import androidx.activity.ComponentActivity
-import androidx.compose.runtime.Composition
-import androidx.compose.runtime.Recomposer
-import androidx.compose.runtime.state
-import androidx.ui.androidview.adapters.setOnClick
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
-import androidx.compose.ui.platform.setContent
-import androidx.ui.demos.common.ActivityDemo
-import androidx.ui.demos.common.DemoCategory
import androidx.compose.foundation.Box
import androidx.compose.foundation.ScrollableColumn
import androidx.compose.foundation.ScrollableRow
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.RectangleShape
-import androidx.compose.ui.graphics.toArgb
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
@@ -48,7 +36,20 @@
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.preferredWidth
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composition
+import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.platform.setContent
import androidx.compose.ui.unit.dp
+import androidx.ui.androidview.adapters.setOnClick
+import androidx.ui.demos.common.ActivityDemo
+import androidx.ui.demos.common.DemoCategory
val ComposeInAndroidDemos = DemoCategory(
"Compose in Android Interop", listOf(
@@ -150,7 +151,7 @@
composition = container.setContent(Recomposer.current()) {
- val currentColor = state { Color.LightGray }
+ val currentColor = remember { mutableStateOf(Color.LightGray) }
val tap =
Modifier.tapGestureFilter {
@@ -196,7 +197,7 @@
val container = findViewById<ViewGroup>(R.id.container)
composition = container.setContent(Recomposer.current()) {
- val currentColor = state { Color.LightGray }
+ val currentColor = remember { mutableStateOf(Color.LightGray) }
Box(
Modifier
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/WebComponentActivity.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/WebComponentActivity.kt
index 8aae896..12bf7cc 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/WebComponentActivity.kt
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/WebComponentActivity.kt
@@ -31,23 +31,22 @@
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.activity.ComponentActivity
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.platform.setContent
+import androidx.compose.ui.viewinterop.emitView
+import androidx.ui.androidview.WebComponent
+import androidx.ui.androidview.WebContext
import androidx.ui.androidview.adapters.dp
import androidx.ui.androidview.adapters.setControlledText
import androidx.ui.androidview.adapters.setLayoutHeight
import androidx.ui.androidview.adapters.setLayoutWeight
import androidx.ui.androidview.adapters.setLayoutWidth
-import androidx.ui.androidview.adapters.setOnClick
import androidx.ui.androidview.adapters.setOnTextChanged
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Stable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.platform.setContent
-import androidx.ui.androidview.WebComponent
-import androidx.ui.androidview.WebContext
-import androidx.compose.ui.viewinterop.emitView
@Stable
class WebParams {
@@ -87,7 +86,7 @@
Log.d("WebCompAct", "renderViews")
}
- val displayedUrl = state { "https://www.google.com" }
+ val displayedUrl = remember { mutableStateOf("https://www.google.com") }
fun updateDisplayedUrl(newValue: String?) {
if (!newValue.isNullOrBlank() && newValue != displayedUrl.value) {
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/CrossfadeDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/CrossfadeDemo.kt
index dd62046..fd214c8 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/CrossfadeDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/CrossfadeDemo.kt
@@ -17,26 +17,26 @@
package androidx.compose.animation.demos
import android.util.Log
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.animation.Crossfade
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
import androidx.compose.foundation.Box
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredHeight
+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.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
import kotlin.random.Random
@Composable
fun CrossfadeDemo() {
- var current by state { tabs[0] }
+ var current by remember { mutableStateOf(tabs[0]) }
Column {
Row {
tabs.forEach { tab ->
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/FancyScrollingDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/FancyScrollingDemo.kt
index 64527aa..2587b79 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/FancyScrollingDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/FancyScrollingDemo.kt
@@ -17,25 +17,26 @@
package androidx.compose.animation.demos
import android.util.Log
+import androidx.compose.animation.animatedFloat
import androidx.compose.animation.core.SpringSpec
import androidx.compose.animation.core.TargetAnimation
import androidx.compose.animation.core.fling
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.animation.animatedFloat
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.rawDragGestureFilter
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.Text
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.rawDragGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import kotlin.math.roundToInt
@@ -51,7 +52,7 @@
modifier = Modifier.padding(40.dp)
)
val animScroll = animatedFloat(0f)
- val itemWidth = state { 0f }
+ val itemWidth = remember { mutableStateOf(0f) }
val gesture = Modifier.rawDragGestureFilter(dragObserver = object : DragObserver {
override fun onDrag(dragDistance: Offset): Offset {
// Snap to new drag position
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/GestureBasedAnimationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/GestureBasedAnimationDemo.kt
index e15f667..0d63697 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/GestureBasedAnimationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/GestureBasedAnimationDemo.kt
@@ -16,20 +16,21 @@
package androidx.compose.animation.demos
+import androidx.compose.animation.ColorPropKey
import androidx.compose.animation.core.FloatPropKey
import androidx.compose.animation.core.spring
import androidx.compose.animation.core.transitionDefinition
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.animation.ColorPropKey
import androidx.compose.animation.transition
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.pressIndicatorGestureFilter
import androidx.compose.foundation.Canvas
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.gesture.pressIndicatorGestureFilter
import androidx.compose.ui.graphics.Color
-import androidx.compose.foundation.layout.fillMaxSize
private const val halfSize = 200f
@@ -59,7 +60,7 @@
@Composable
fun GestureBasedAnimationDemo() {
- val toState = state { ComponentState.Released }
+ val toState = remember { mutableStateOf(ComponentState.Released) }
val pressIndicator =
Modifier.pressIndicatorGestureFilter(
onStart = { toState.value = ComponentState.Pressed },
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/MultiDimensionalAnimationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/MultiDimensionalAnimationDemo.kt
index f44e382..a54d5b7 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/MultiDimensionalAnimationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/MultiDimensionalAnimationDemo.kt
@@ -16,28 +16,27 @@
package androidx.compose.animation.demos
+import androidx.compose.animation.ColorPropKey
+import androidx.compose.animation.RectPropKey
import androidx.compose.animation.core.spring
import androidx.compose.animation.core.transitionDefinition
import androidx.compose.animation.core.tween
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.state
-import androidx.compose.runtime.structuralEqualityPolicy
-import androidx.compose.animation.ColorPropKey
-import androidx.compose.animation.RectPropKey
import androidx.compose.animation.transition
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
-import androidx.compose.foundation.layout.fillMaxSize
@Composable
fun MultiDimensionalAnimationDemo() {
- val currentState = state { AnimState.Collapsed }
+ val currentState = remember { mutableStateOf(AnimState.Collapsed) }
val onClick = {
// Cycle through states when clicked.
currentState.value = when (currentState.value) {
@@ -47,8 +46,8 @@
}
}
- val width = state(policy = structuralEqualityPolicy()) { 0f }
- val height = state(policy = structuralEqualityPolicy()) { 0f }
+ val width = remember { mutableStateOf(0f) }
+ val height = remember { mutableStateOf(0f) }
val state = transition(
definition = remember(width.value, height.value) {
createTransDef(width.value, height.value)
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/RepeatedRotationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/RepeatedRotationDemo.kt
index 8798c14..8e0f618 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/RepeatedRotationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/RepeatedRotationDemo.kt
@@ -21,28 +21,29 @@
import androidx.compose.animation.core.repeatable
import androidx.compose.animation.core.transitionDefinition
import androidx.compose.animation.core.tween
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
import androidx.compose.animation.transition
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.drawscope.rotate
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.rotate
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@Composable
fun RepeatedRotationDemo() {
- val state = state { RotationStates.Original }
+ val state = remember { mutableStateOf(RotationStates.Original) }
Column(
Modifier.fillMaxSize()
.wrapContentSize(Alignment.Center),
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SingleValueAnimationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SingleValueAnimationDemo.kt
index f2a34ea..6b39349 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SingleValueAnimationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SingleValueAnimationDemo.kt
@@ -16,18 +16,19 @@
package androidx.compose.animation.demos
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
import androidx.compose.animation.animate
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Box
import androidx.compose.foundation.clickable
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
@Composable
fun SingleValueAnimationDemo() {
- val enabled = state { true }
+ val enabled = remember { mutableStateOf(true) }
val color = animate(if (enabled.value) Color.Green else Color.Red)
Box(
Modifier.fillMaxSize().clickable { enabled.value = !enabled.value },
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringBackScrollingDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringBackScrollingDemo.kt
index 9fa38f3..1b55e5b 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringBackScrollingDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SpringBackScrollingDemo.kt
@@ -17,25 +17,26 @@
package androidx.compose.animation.demos
import android.util.Log
+import androidx.compose.animation.animatedFloat
import androidx.compose.animation.core.SpringSpec
import androidx.compose.animation.core.fling
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.animation.animatedFloat
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.rawDragGestureFilter
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.Text
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.rawDragGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import kotlin.math.roundToInt
@@ -49,8 +50,8 @@
modifier = Modifier.padding(40.dp)
)
val animScroll = animatedFloat(0f)
- val itemWidth = state { 0f }
- val isFlinging = state { false }
+ val itemWidth = remember { mutableStateOf(0f) }
+ val isFlinging = remember { mutableStateOf(false) }
val gesture = Modifier.rawDragGestureFilter(dragObserver = object : DragObserver {
override fun onDrag(dragDistance: Offset): Offset {
animScroll.snapTo(animScroll.targetValue + dragDistance.x)
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/StateBasedRippleDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/StateBasedRippleDemo.kt
index 3748499..3b0531e 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/StateBasedRippleDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/StateBasedRippleDemo.kt
@@ -24,18 +24,18 @@
import androidx.compose.animation.core.keyframes
import androidx.compose.animation.core.transitionDefinition
import androidx.compose.animation.core.tween
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.state
import androidx.compose.animation.transition
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.pressIndicatorGestureFilter
import androidx.compose.foundation.Box
import androidx.compose.foundation.Canvas
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.pressIndicatorGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.unit.dp
@Composable
@@ -48,7 +48,7 @@
@Composable
private fun RippleRect() {
val radius = with(DensityAmbient.current) { TargetRadius.toPx() }
- val toState = state { ButtonStatus.Initial }
+ val toState = remember { mutableStateOf(ButtonStatus.Initial) }
val rippleTransDef = remember { createTransDef(radius) }
val onPress: (Offset) -> Unit = { position ->
down.x = position.x
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SwipeToDismissDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SwipeToDismissDemo.kt
index c09612b..0753ed2 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SwipeToDismissDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/compose/animation/demos/SwipeToDismissDemo.kt
@@ -16,30 +16,31 @@
package androidx.compose.animation.demos
+import androidx.compose.animation.animatedFloat
import androidx.compose.animation.core.AnimationEndReason
import androidx.compose.animation.core.ExponentialDecay
import androidx.compose.animation.core.FastOutSlowInEasing
import androidx.compose.animation.core.SpringSpec
import androidx.compose.animation.core.TargetAnimation
import androidx.compose.animation.core.fling
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.animation.animatedFloat
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.rawDragGestureFilter
-import androidx.compose.ui.onPositioned
import androidx.compose.foundation.Canvas
import androidx.compose.foundation.Text
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.rawDragGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.drawscope.DrawScope
+import androidx.compose.ui.onPositioned
+import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import kotlin.math.sign
@@ -63,9 +64,9 @@
@Composable
private fun SwipeToDismiss() {
val itemBottom = animatedFloat(height)
- val index = state { 0 }
- val itemWidth = state { 0f }
- val isFlinging = state { false }
+ val index = remember { mutableStateOf(0) }
+ val itemWidth = remember { mutableStateOf(0f) }
+ val isFlinging = remember { mutableStateOf(false) }
val modifier = Modifier.rawDragGestureFilter(dragObserver = object : DragObserver {
override fun onStart(downPosition: Offset) {
itemBottom.setBounds(0f, height)
diff --git a/ui/ui-animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt b/ui/ui-animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
index 29de2dd..51b7e0d 100644
--- a/ui/ui-animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
+++ b/ui/ui-animation/src/androidAndroidTest/kotlin/androidx/compose/animation/CrossfadeTest.kt
@@ -17,13 +17,13 @@
import androidx.compose.animation.core.AnimationConstants.DefaultDurationMillis
import androidx.compose.animation.core.TweenSpec
+import androidx.compose.foundation.Text
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.onDispose
+import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.test.filters.MediumTest
-import androidx.compose.foundation.Text
import androidx.ui.test.createComposeRule
import androidx.ui.test.onNodeWithText
import androidx.ui.test.runOnIdle
@@ -46,7 +46,7 @@
composeTestRule.clockTestRule.pauseClock()
composeTestRule.setContent {
- val showFirst by state { true }
+ val showFirst by remember { mutableStateOf(true) }
Crossfade(showFirst) {
Text(if (it) First else Second)
}
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt
index 4a1aeca..2e01354 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/PopupDemo.kt
@@ -16,7 +16,6 @@
package androidx.compose.ui.demos
-import androidx.compose.runtime.Composable
import androidx.compose.foundation.BaseTextField
import androidx.compose.foundation.Box
import androidx.compose.foundation.ContentGravity
@@ -36,21 +35,23 @@
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.preferredWidth
import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.runtime.state
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.window.Popup
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.window.Popup
@Composable
fun PopupDemo() {
- val exampleIndex = state { 0 }
+ val exampleIndex = remember { mutableStateOf(0) }
val totalExamples = 8
Column {
@@ -127,7 +128,7 @@
@Composable
private fun ColumnScope.PopupToggle() {
- val showPopup = state { true }
+ val showPopup = remember { mutableStateOf(true) }
Column(Modifier.gravity(Alignment.CenterHorizontally)) {
Box(Modifier.preferredSize(100.dp)) {
@@ -163,9 +164,9 @@
Column(Modifier.gravity(Alignment.CenterHorizontally)) {
val heightSize = 120.dp
val widthSize = 160.dp
- val popupContentState = state { 0 }
+ val popupContentState = remember { mutableStateOf(0) }
val totalContentExamples = 2
- val popupCounter = state { 0 }
+ val popupCounter = remember { mutableStateOf(0) }
Box(Modifier.preferredSize(widthSize, heightSize), backgroundColor = Color.Gray) {
Popup(Alignment.Center) {
@@ -201,10 +202,10 @@
private fun ColumnScope.PopupWithChangingParent() {
val containerWidth = 400.dp
val containerHeight = 200.dp
- val parentGravity = state { ContentGravity.TopStart }
- val parentWidth = state { 80.dp }
- val parentHeight = state { 60.dp }
- val parentSizeChanged = state { false }
+ val parentGravity = remember { mutableStateOf(ContentGravity.TopStart) }
+ val parentWidth = remember { mutableStateOf(80.dp) }
+ val parentHeight = remember { mutableStateOf(60.dp) }
+ val parentSizeChanged = remember { mutableStateOf(false) }
Column(Modifier.gravity(Alignment.CenterHorizontally)) {
Box(
@@ -255,8 +256,8 @@
Column(Modifier.gravity(Alignment.CenterHorizontally)) {
val heightSize = 200.dp
val widthSize = 400.dp
- val counter = state { 0 }
- val popupAlignment = state { Alignment.TopStart }
+ val counter = remember { mutableStateOf(0) }
+ val popupAlignment = remember { mutableStateOf(Alignment.TopStart) }
Box(
modifier = Modifier.preferredSize(widthSize, heightSize),
backgroundColor = Color.Red,
@@ -299,11 +300,11 @@
val widthSize = 190.dp
val heightSize = 120.dp
val editLineSize = 150.dp
- val showEmail = state {
- "Enter your email in the white rectangle and click outside"
+ val showEmail = remember {
+ mutableStateOf("Enter your email in the white rectangle and click outside")
}
- val email = state { "email" }
- val showPopup = state { true }
+ val email = remember { mutableStateOf("email") }
+ val showPopup = remember { mutableStateOf(true) }
Text(text = showEmail.value)
@@ -338,10 +339,10 @@
@Composable
private fun ColumnScope.PopupWithChangingSize() {
Column(Modifier.gravity(Alignment.CenterHorizontally)) {
- val showPopup = state { true }
+ val showPopup = remember { mutableStateOf(true) }
val heightSize = 120.dp
val widthSize = 160.dp
- val rectangleState = state { 0 }
+ val rectangleState = remember { mutableStateOf(0) }
Spacer(Modifier.preferredHeight(15.dp))
Box(
@@ -447,7 +448,7 @@
initialText: String = "",
color: Color = Color.White
) {
- val state = state { TextFieldValue(initialText) }
+ val state = remember { mutableStateOf(TextFieldValue(initialText)) }
BaseTextField(
value = state.value,
modifier = modifier.background(color = color),
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
index 2f11fdc..9785349 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/autofill/ExplicitAutofillTypesDemo.kt
@@ -26,7 +26,8 @@
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.material.MaterialTheme
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.autofill.AutofillNode
import androidx.compose.ui.autofill.AutofillType
@@ -45,8 +46,8 @@
@OptIn(ExperimentalFoundationApi::class)
fun ExplicitAutofillTypesDemo() {
Column {
- val nameState = state { TextFieldValue("Enter name here") }
- val emailState = state { TextFieldValue("Enter email here") }
+ val nameState = remember { mutableStateOf(TextFieldValue("Enter name here")) }
+ val emailState = remember { mutableStateOf(TextFieldValue("Enter email here")) }
val autofill = AutofillAmbient.current
val labelStyle = MaterialTheme.typography.subtitle1
val textStyle = MaterialTheme.typography.h6
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
index 84c6c6b..6eed404 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/FocusableDemo.kt
@@ -15,26 +15,27 @@
*/
package androidx.compose.ui.demos.focus
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.ExperimentalFocus
-import androidx.compose.ui.focus.FocusRequester
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color.Companion.Black
-import androidx.compose.ui.graphics.Color.Companion.Green
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth
+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.focus
+import androidx.compose.ui.focus.ExperimentalFocus
+import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.isFocused
import androidx.compose.ui.focusObserver
import androidx.compose.ui.focusRequester
import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color.Companion.Black
+import androidx.compose.ui.graphics.Color.Companion.Green
@Composable
fun FocusableDemo() {
@@ -59,7 +60,7 @@
@Composable
@OptIn(ExperimentalFocus::class)
private fun FocusableText(text: String) {
- var color by state { Black }
+ var color by remember { mutableStateOf(Black) }
val focusRequester = FocusRequester()
Text(
modifier = Modifier
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusRequester.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusRequester.kt
index b13455f..b6d5d576 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusRequester.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/focus/ReuseFocusRequester.kt
@@ -25,19 +25,20 @@
import androidx.compose.foundation.layout.fillMaxSize
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.runtime.state
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.Color
import androidx.compose.ui.focus.ExperimentalFocus
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.isFocused
import androidx.compose.ui.focusObserver
import androidx.compose.ui.focusRequester
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Size
import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
private const val size = 200f
private enum class CurrentShape { Circle, Square }
@@ -56,7 +57,7 @@
// Shared focus requester.
val focusRequester = FocusRequester()
- var shape by state { CurrentShape.Square }
+ var shape by remember { mutableStateOf(CurrentShape.Square) }
when (shape) {
CurrentShape.Circle -> Circle(
modifier = Modifier
@@ -77,7 +78,7 @@
@Composable
@OptIn(ExperimentalFocus::class)
private fun Circle(modifier: Modifier = Modifier, nextShape: () -> Unit) {
- var isFocused by state { false }
+ var isFocused by remember { mutableStateOf(false) }
val scale = animate(if (isFocused) 0f else 1f, TweenSpec(2000)) {
if (it == 0f) {
nextShape()
@@ -101,7 +102,7 @@
@Composable
@OptIn(ExperimentalFocus::class)
private fun Square(modifier: Modifier = Modifier, nextShape: () -> Unit) {
- var isFocused by state { false }
+ var isFocused by remember { mutableStateOf(false) }
val scale = animate(if (isFocused) 0f else 1f, TweenSpec(2000)) {
if (it == 0f) {
nextShape()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt
index 2d27818..2e0f855 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapGestureDetectorDemo.kt
@@ -16,11 +16,6 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.doubleTapGestureFilter
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
@@ -29,7 +24,13 @@
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.doubleTapGestureFilter
import androidx.compose.ui.unit.dp
/**
@@ -37,7 +38,7 @@
*/
@Composable
fun DoubleTapGestureFilterDemo() {
- val color = state { Colors.random() }
+ val color = remember { mutableStateOf(Colors.random()) }
val onDoubleTap: (Offset) -> Unit = {
color.value = color.value.anotherRandomColor()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
index 27f8afe..7eef9bc 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
@@ -16,30 +16,31 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
import androidx.compose.foundation.drawBorder
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.gesture.doubleTapGestureFilter
import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.unit.dp
@Composable
fun DoubleTapInTapDemo() {
val defaultColor = Grey
- val innerColor = state { defaultColor }
- val outerColor = state { defaultColor }
+ val innerColor = remember { mutableStateOf(defaultColor) }
+ val outerColor = remember { mutableStateOf(defaultColor) }
val onTap: (Offset) -> Unit = {
outerColor.value = outerColor.value.next()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
index 2bb6bb7..75f0f7c 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragScaleGestureDetectorDemo.kt
@@ -16,14 +16,6 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.ScaleObserver
-import androidx.compose.ui.gesture.dragGestureFilter
-import androidx.compose.ui.gesture.scaleGestureFilter
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.layout.Column
@@ -31,7 +23,16 @@
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.ScaleObserver
+import androidx.compose.ui.gesture.dragGestureFilter
+import androidx.compose.ui.gesture.scaleGestureFilter
import androidx.compose.ui.gesture.tapGestureFilter
import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.unit.dp
@@ -42,9 +43,9 @@
*/
@Composable
fun DragAndScaleGestureFilterDemo() {
- val size = state { 200.dp }
- val offset = state { Offset.Zero }
- val dragInScale = state { false }
+ val size = remember { mutableStateOf(200.dp) }
+ val offset = remember { mutableStateOf(Offset.Zero) }
+ val dragInScale = remember { mutableStateOf(false) }
val scaleObserver = object : ScaleObserver {
override fun onScale(scaleFactor: Float) {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
index f2a0c4e..e286fdc 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/DragSlopExceededGestureFilterDemo.kt
@@ -16,19 +16,20 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.dragSlopExceededGestureFilter
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.gesture.Direction
+import androidx.compose.ui.gesture.dragSlopExceededGestureFilter
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
/**
@@ -40,7 +41,7 @@
val verticalColor = Color(0xfff44336)
val horizontalColor = Color(0xff2196f3)
- val orientationVertical = state { true }
+ val orientationVertical = remember { mutableStateOf(true) }
// This would be more efficient if onTouchSlopExceeded were memoized because it's
// value doesn't need to change for each new composition. Like this, every time
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
index d6ebdd3..05fe809 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/HorizontalScrollersInVerticalScrollerDemo.kt
@@ -16,31 +16,32 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.ContentDrawScope
-import androidx.compose.ui.DrawModifier
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
import androidx.compose.foundation.drawBorder
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.ContentDrawScope
+import androidx.compose.ui.DrawModifier
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.gesture.Direction
+import androidx.compose.ui.gesture.ScrollCallback
import androidx.compose.ui.gesture.doubleTapGestureFilter
import androidx.compose.ui.gesture.longPressGestureFilter
import androidx.compose.ui.gesture.pressIndicatorGestureFilter
import androidx.compose.ui.gesture.scrollGestureFilter
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.clipRect
+import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import kotlin.math.roundToInt
@@ -81,8 +82,8 @@
@Composable
private fun Scrollable(orientation: Orientation, children: @Composable () -> Unit) {
val maxOffset = 0f
- val offset = state { maxOffset }
- val minOffset = state { 0f }
+ val offset = remember { mutableStateOf(maxOffset) }
+ val minOffset = remember { mutableStateOf(0f) }
val scrollObserver = object : ScrollCallback {
override fun onScroll(scrollDistance: Float): Float {
@@ -183,8 +184,8 @@
val pressedColor = PressedColor
val defaultColor = Red
- val color = state { defaultColor }
- val showPressed = state { false }
+ val color = remember { mutableStateOf(defaultColor) }
+ val showPressed = remember { mutableStateOf(false) }
val onPress: (Offset) -> Unit = {
showPressed.value = true
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
index b2148fe..1853323 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressDragGestureDetectorDemo.kt
@@ -16,12 +16,6 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.longPressDragGestureFilter
-import androidx.compose.ui.gesture.LongPressDragObserver
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.layout.Column
@@ -29,7 +23,14 @@
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.LongPressDragObserver
+import androidx.compose.ui.gesture.longPressDragGestureFilter
import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.unit.dp
@@ -39,8 +40,8 @@
@Composable
fun LongPressDragGestureFilterDemo() {
- val offset = state { Offset.Zero }
- val color = state { Grey }
+ val offset = remember { mutableStateOf(Offset.Zero) }
+ val color = remember { mutableStateOf(Grey) }
val longPressDragObserver =
object : LongPressDragObserver {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt
index 8bb8395..ebcefca 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/LongPressGestureDetectorDemo.kt
@@ -16,11 +16,6 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.longPressGestureFilter
import androidx.compose.foundation.Border
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
@@ -28,7 +23,13 @@
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.longPressGestureFilter
import androidx.compose.ui.unit.dp
/**
@@ -36,7 +37,7 @@
*/
@Composable
fun LongPressGestureDetectorDemo() {
- val color = state { Colors.random() }
+ val color = remember { mutableStateOf(Colors.random()) }
val onLongPress = { _: Offset ->
color.value = color.value.anotherRandomColor()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt
index e6c9ffe..08a3fcc 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedLongPressDemo.kt
@@ -16,19 +16,20 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Border
import androidx.compose.foundation.Box
import androidx.compose.foundation.ContentGravity
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.compositeOver
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.gesture.longPressGestureFilter
+import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.unit.dp
/**
@@ -62,8 +63,8 @@
val defaultColor = DefaultBackgroundColor
val pressedColor = PressedColor
- val currentColor = state { defaultColor }
- val pressed = state { false }
+ val currentColor = remember { mutableStateOf(defaultColor) }
+ val pressed = remember { mutableStateOf(false) }
val onLongPress: (Offset) -> Unit = {
currentColor.value = currentColor.value.next()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt
index 06a6648..32f3969 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedPressDemo.kt
@@ -16,21 +16,22 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Border
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.compositeOver
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.gesture.doubleTapGestureFilter
import androidx.compose.ui.gesture.longPressGestureFilter
import androidx.compose.ui.gesture.pressIndicatorGestureFilter
import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.unit.dp
/**
@@ -65,8 +66,8 @@
val defaultColor = DefaultBackgroundColor
val pressedColor = PressedColor
- val currentColor = state { defaultColor }
- val pressed = state { false }
+ val currentColor = remember { mutableStateOf(defaultColor) }
+ val pressed = remember { mutableStateOf(false) }
val onStart: (Any) -> Unit = {
pressed.value = true
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScalingDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScalingDemo.kt
index a879e06..bdbed74 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScalingDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScalingDemo.kt
@@ -16,18 +16,19 @@
package androidx.compose.ui.demos.gestures
+import androidx.compose.foundation.Text
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Layout
import androidx.compose.ui.Modifier
import androidx.compose.ui.gesture.RawScaleObserver
-import androidx.compose.foundation.Text
-import androidx.compose.foundation.background
-import androidx.compose.ui.graphics.Color
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.ui.gesture.rawScaleGestureFilter
+import androidx.compose.ui.graphics.Color
import kotlin.math.roundToInt
/**
@@ -66,7 +67,7 @@
children: @Composable () -> Unit
) {
- val currentPercent = state { 1f }
+ val currentPercent = remember { mutableStateOf(1f) }
val outerScaleObserver = object : RawScaleObserver {
override fun onScale(scaleFactor: Float): Float {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
index 0e24910..243ff16 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/NestedScrollingDemo.kt
@@ -16,30 +16,31 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
import androidx.compose.foundation.Border
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
import androidx.compose.foundation.drawBorder
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clipToBounds
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.gesture.Direction
+import androidx.compose.ui.gesture.ScrollCallback
import androidx.compose.ui.gesture.doubleTapGestureFilter
import androidx.compose.ui.gesture.longPressGestureFilter
import androidx.compose.ui.gesture.pressIndicatorGestureFilter
import androidx.compose.ui.gesture.scrollGestureFilter
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import kotlin.math.roundToInt
@@ -76,8 +77,8 @@
*/
@Composable
private fun Scrollable(children: @Composable () -> Unit) {
- val offset = state { 0f }
- val maxOffset = state { 0f }
+ val offset = remember { mutableStateOf(0f) }
+ val maxOffset = remember { mutableStateOf(0f) }
val scrollObserver = object : ScrollCallback {
override fun onScroll(scrollDistance: Float): Float {
@@ -136,8 +137,8 @@
val pressedColor = PressedColor
val defaultColor = DefaultBackgroundColor
- val color = state { defaultColor }
- val showPressed = state { false }
+ val color = remember { mutableStateOf(defaultColor) }
+ val showPressed = remember { mutableStateOf(false) }
val onPress: (Offset) -> Unit = {
showPressed.value = true
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
index ecfdd804..42cb0c7 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PointerInputDuringSubCompDemo.kt
@@ -16,24 +16,24 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.composed
-import androidx.compose.ui.input.pointer.PointerInputFilter
-import androidx.compose.ui.input.pointer.PointerInputModifier
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
import androidx.compose.foundation.drawBorder
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.lazy.LazyColumnFor
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.pointer.PointerInputFilter
+import androidx.compose.ui.input.pointer.PointerInputModifier
import androidx.compose.ui.platform.PointerEventPass
import androidx.compose.ui.platform.PointerInputChange
import androidx.compose.ui.platform.changedToDownIgnoreConsumed
@@ -68,7 +68,7 @@
.size(200.dp)
.background(color = Color.White)
) {
- val pointerCount = state { 0 }
+ val pointerCount = remember { mutableStateOf(0) }
Box(
Modifier.fillParentMaxSize()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
index babbc3a8..8ba9771 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PopupDragDemo.kt
@@ -16,33 +16,31 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
import androidx.compose.foundation.Box
import androidx.compose.foundation.ContentGravity
import androidx.compose.foundation.Text
-import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Stack
import androidx.compose.foundation.layout.preferredSize
-import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.DragObserver
import androidx.compose.ui.gesture.dragGestureFilter
-import androidx.compose.ui.window.Popup
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.round
+import androidx.compose.ui.window.Popup
@Composable
fun PopupDragDemo() {
// TODO fix this demo in RTL (check when draggable handles RTL)
- val offset = state {
- Offset.Zero
- }
+ val offset = remember { mutableStateOf(Offset.Zero) }
val observer = remember {
object : DragObserver {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt
index 5f8dc47..0597cb7 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/PressIndicatorGestureDetectorDemo.kt
@@ -16,20 +16,21 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.pressIndicatorGestureFilter
import androidx.compose.foundation.Border
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.compositeOver
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.pressIndicatorGestureFilter
+import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.unit.dp
/**
@@ -37,7 +38,7 @@
*/
@Composable
fun PressIndicatorGestureFilterDemo() {
- val pressed = state { false }
+ val pressed = remember { mutableStateOf(false) }
val onStart: (Offset) -> Unit = {
pressed.value = true
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
index 73b5b01..ec02bc0 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/RawDragGestureDetectorDemo.kt
@@ -16,12 +16,6 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.rawDragGestureFilter
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.layout.Column
@@ -29,7 +23,14 @@
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.rawDragGestureFilter
import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.unit.dp
@@ -38,7 +39,7 @@
*/
@Composable
fun RawDragGestureFilterDemo() {
- val offset = state { Offset.Zero }
+ val offset = remember { mutableStateOf(Offset.Zero) }
val dragObserver = object : DragObserver {
override fun onDrag(dragDistance: Offset): Offset {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt
index 0335ed4..a50cc3f 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScaleGestureDetectorDemo.kt
@@ -16,19 +16,20 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.ScaleObserver
-import androidx.compose.ui.gesture.scaleGestureFilter
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.ScaleObserver
+import androidx.compose.ui.gesture.scaleGestureFilter
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
/**
@@ -36,7 +37,7 @@
*/
@Composable
fun ScaleGestureFilterDemo() {
- val size = state { 192.dp }
+ val size = remember { mutableStateOf(192.dp) }
val scaleObserver = object : ScaleObserver {
override fun onScale(scaleFactor: Float) {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
index fe9ce75..aa3dfec5 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/ScrollGestureFilterDemo.kt
@@ -16,23 +16,24 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.emptyContent
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.emptyContent
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.ScrollCallback
import androidx.compose.ui.gesture.scrollGestureFilter
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
@@ -66,8 +67,8 @@
children: @Composable () -> Unit = emptyContent()
) {
- val color = state { idleColor }
- val offsetPx = state { 0f }
+ val color = remember { mutableStateOf(idleColor) }
+ val offsetPx = remember { mutableStateOf(0f) }
val offsetDp = with(DensityAmbient.current) {
offsetPx.value.toDp()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt
index 8947f72..d9f499c 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TapGestureDetectorDemo.kt
@@ -16,11 +16,6 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
import androidx.compose.foundation.Border
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
@@ -28,8 +23,14 @@
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.gesture.tapGestureFilter
import androidx.compose.ui.unit.dp
/**
@@ -37,7 +38,7 @@
*/
@Composable
fun TapGestureFilterDemo() {
- val color = state { Colors.random() }
+ val color = remember { mutableStateOf(Colors.random()) }
val onTap: (Offset) -> Unit = {
color.value = color.value.anotherRandomColor()
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
index 58f5c35..c2ebe48 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/TouchSlopDragGestureDetectorDemo.kt
@@ -16,22 +16,23 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.dragGestureFilter
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.gesture.Direction
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.dragGestureFilter
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.unit.dp
@@ -44,8 +45,8 @@
val verticalColor = Color(0xfff44336)
val horizontalColor = Color(0xff2196f3)
- val offset = state { Offset.Zero }
- val canStartVertically = state { true }
+ val offset = remember { mutableStateOf(Offset.Zero) }
+ val canStartVertically = remember { mutableStateOf(true) }
val dragObserver =
if (canStartVertically.value) {
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
index 8adf3d1..d245991 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/gestures/VerticalScrollerInDrawerLayoutDemo.kt
@@ -16,22 +16,10 @@
package androidx.compose.ui.demos.gestures
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.ContentDrawScope
-import androidx.compose.ui.DrawModifier
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.ScrollCallback
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
import androidx.compose.foundation.drawBorder
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.Row
@@ -43,14 +31,27 @@
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.ContentDrawScope
+import androidx.compose.ui.DrawModifier
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.gesture.Direction
+import androidx.compose.ui.gesture.ScrollCallback
import androidx.compose.ui.gesture.doubleTapGestureFilter
import androidx.compose.ui.gesture.longPressGestureFilter
import androidx.compose.ui.gesture.pressIndicatorGestureFilter
import androidx.compose.ui.gesture.scrollGestureFilter
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.clipRect
import androidx.compose.ui.platform.DensityAmbient
+import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import kotlin.math.roundToInt
@@ -86,7 +87,7 @@
-drawerWidth.toPx()
}
- val currentOffset = state { minOffset }
+ val currentOffset = remember { mutableStateOf(minOffset) }
val maxOffset = 0f
val scrollObserver = object : ScrollCallback {
@@ -134,8 +135,8 @@
@Composable
private fun Scrollable(orientation: Orientation, children: @Composable () -> Unit) {
val maxOffset = 0f
- val offset = state { maxOffset }
- val minOffset = state { 0f }
+ val offset = remember { mutableStateOf(maxOffset) }
+ val minOffset = remember { mutableStateOf(0f) }
val scrollObserver = object : ScrollCallback {
override fun onScroll(scrollDistance: Float): Float {
@@ -235,8 +236,8 @@
val pressedColor = PressedColor
val defaultColor = Red
- val color = state { defaultColor }
- val showPressed = state { false }
+ val color = remember { mutableStateOf(defaultColor) }
+ val showPressed = remember { mutableStateOf(false) }
val onPress: (Offset) -> Unit = {
showPressed.value = true
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
index 81f9b34..e918416 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/keyinput/KeyInputDemo.kt
@@ -15,30 +15,31 @@
*/
package androidx.compose.ui.demos.keyinput
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.focus.ExperimentalFocus
-import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.input.key.ExperimentalKeyInput
-import androidx.compose.ui.input.key.Key
-import androidx.compose.ui.input.key.KeyEvent
-import androidx.compose.ui.input.key.KeyEventType
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+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.focus
+import androidx.compose.ui.focus.ExperimentalFocus
+import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.isFocused
import androidx.compose.ui.focusObserver
import androidx.compose.ui.focusRequester
import androidx.compose.ui.gesture.tapGestureFilter
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.key.ExperimentalKeyInput
+import androidx.compose.ui.input.key.Key
+import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.input.key.KeyEventType
import androidx.compose.ui.input.key.keyInputFilter
@Composable
@@ -52,13 +53,13 @@
)
}
CenteredRow {
- FocusableText(state { "Enter Text Here" })
+ FocusableText(remember { mutableStateOf("Enter Text Here") })
}
CenteredRow {
- FocusableText(state { "Enter Text Here" })
+ FocusableText(remember { mutableStateOf("Enter Text Here") })
}
CenteredRow {
- FocusableText(state { "Enter Text Here" })
+ FocusableText(remember { mutableStateOf("Enter Text Here") })
}
}
}
@@ -69,7 +70,7 @@
ExperimentalKeyInput::class
)
private fun FocusableText(text: MutableState<String>) {
- var color by state { Color.Black }
+ var color by remember { mutableStateOf(Color.Black) }
val focusRequester = FocusRequester()
Text(
modifier = Modifier
diff --git a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt
index 5d4b705..f5074b7 100644
--- a/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt
+++ b/ui/ui-core/integration-tests/ui-core-demos/src/main/java/androidx/compose/ui/demos/viewinterop/ViewInterop.kt
@@ -24,11 +24,6 @@
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.TextView
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
@@ -36,6 +31,12 @@
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.size
import androidx.compose.material.Button
+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.demos.databinding.TestLayoutBinding
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
@@ -60,7 +61,7 @@
AndroidView({ context -> TextView(context).apply { text = "This is a TextView" } })
// Compose Android View and update its size based on state. The AndroidView takes modifiers.
- var size by state { 20 }
+ var size by remember { mutableStateOf(20) }
AndroidView(::View, Modifier.clickable { size += 20 }.background(Color.Blue)) { view ->
view.layoutParams = ViewGroup.LayoutParams(size, size)
}
@@ -93,7 +94,7 @@
Button(onClick = { squareRef.value!!.size += 50 }) {
Text("Increase size of Android view")
}
- val colorIndex = state { 0 }
+ val colorIndex = remember { mutableStateOf(0) }
Button(onClick = {
colorIndex.value = (colorIndex.value + 1) % 4
squareRef.value!!.color = arrayOf(
diff --git a/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt b/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
index 6a732db..e01a857 100644
--- a/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
+++ b/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/AndroidViewSample.kt
@@ -24,10 +24,11 @@
import androidx.compose.foundation.clickable
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.runtime.state
-import androidx.compose.ui.graphics.Color
import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.viewinterop.AndroidView
@Sampled
@@ -36,7 +37,7 @@
// Compose a TextView.
AndroidView({ context -> TextView(context).apply { text = "This is a TextView" } })
// Compose a View and update its size based on state. Note the modifiers.
- var size by state { 20 }
+ var size by remember { mutableStateOf(20) }
AndroidView(::View, Modifier.clickable { size += 20 }.background(Color.Blue)) { view ->
view.layoutParams = ViewGroup.LayoutParams(size, size)
}
diff --git a/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/DialogSample.kt b/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/DialogSample.kt
index ec5a720..9d2e392 100644
--- a/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/DialogSample.kt
+++ b/ui/ui-core/samples/src/main/java/androidx/compose/ui/samples/DialogSample.kt
@@ -20,7 +20,8 @@
import androidx.compose.foundation.Box
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
@@ -29,7 +30,7 @@
@Sampled
@Composable
fun DialogSample() {
- val openDialog = state { true }
+ val openDialog = remember { mutableStateOf(true) }
val dialogWidth = 200.dp
val dialogHeight = 50.dp
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
index b7663f9..2b2aa18 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidLayoutDrawTest.kt
@@ -29,8 +29,12 @@
import android.widget.FrameLayout
import android.widget.LinearLayout
import androidx.annotation.RequiresApi
+import androidx.compose.foundation.drawBackground
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.FrameManager
+import androidx.compose.runtime.Providers
import androidx.compose.runtime.Stable
import androidx.compose.runtime.State
import androidx.compose.runtime.emptyContent
@@ -38,17 +42,6 @@
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.unit.constrainHeight
-import androidx.compose.ui.unit.constrainWidth
-import androidx.compose.ui.layout.layoutId
-import androidx.compose.ui.unit.offset
-import androidx.compose.foundation.drawBackground
-import androidx.compose.ui.test.TestActivity
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
@@ -58,23 +51,29 @@
import androidx.compose.ui.graphics.drawscope.Stroke
import androidx.compose.ui.graphics.drawscope.clipRect
import androidx.compose.ui.graphics.drawscope.translate
-import androidx.compose.foundation.layout.offset
-import androidx.compose.foundation.layout.padding
-import androidx.compose.runtime.Providers
-import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
-import androidx.compose.ui.unit.Density
-import androidx.compose.ui.unit.IntSize
-import androidx.compose.ui.layout.LayoutCoordinates
import androidx.compose.ui.layout.IntrinsicMeasurable
import androidx.compose.ui.layout.IntrinsicMeasureScope
+import androidx.compose.ui.layout.LayoutCoordinates
import androidx.compose.ui.layout.id
+import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.layout.positionInRoot
import androidx.compose.ui.node.InternalCoreApi
import androidx.compose.ui.node.Owner
import androidx.compose.ui.node.Ref
+import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.platform.LayoutDirectionAmbient
import androidx.compose.ui.platform.setContent
+import androidx.compose.ui.test.TestActivity
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.constrainHeight
+import androidx.compose.ui.unit.constrainWidth
+import androidx.compose.ui.unit.offset
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
import org.junit.Assert.assertEquals
import org.junit.Assert.assertFalse
import org.junit.Assert.assertNotNull
@@ -2191,7 +2190,7 @@
activityTestRule.runOnUiThreadIR {
activity.setContent {
Layout(children = {
- val state = state { false }
+ val state = remember { mutableStateOf(false) }
var lastLayoutValue: Boolean = false
Layout(children = {}, modifier = Modifier.drawBehind {
// this verifies the layout was remeasured before being drawn
@@ -3129,7 +3128,7 @@
offset: State<Int>,
child: @Composable () -> Unit
) {
- val maxPosition = state { Constraints.Infinity }
+ val maxPosition = remember { mutableStateOf(Constraints.Infinity) }
ScrollerLayout(
modifier = modifier,
maxPosition = maxPosition.value,
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
index 79b2b57..e8b45f2 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/graphics/vector/VectorInvalidationTestCase.kt
@@ -18,15 +18,16 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.AtLeastSize
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.paint
import androidx.compose.ui.drawBehind
-import androidx.compose.ui.test.R
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.res.loadVectorResource
+import androidx.compose.ui.test.R
import java.util.concurrent.CountDownLatch
class VectorInvalidationTestCase(var latch: CountDownLatch) {
@@ -42,7 +43,7 @@
@Composable
fun createTestVector() {
- val state = state { R.drawable.ic_triangle2 }
+ val state = remember { mutableStateOf(R.drawable.ic_triangle2) }
vectorState = state
val vectorAsset = loadVectorResource(state.value)
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
index b611c22..816ff9b 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/LayerTouchTransformTest.kt
@@ -17,32 +17,33 @@
package androidx.compose.ui.input.pointer
import android.os.Build
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.offset
+import androidx.compose.foundation.layout.preferredSize
import androidx.compose.runtime.Composable
import androidx.compose.runtime.emptyContent
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Layout
import androidx.compose.ui.Modifier
import androidx.compose.ui.TransformOrigin
import androidx.compose.ui.drawBehind
import androidx.compose.ui.drawLayer
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.gesture.pressIndicatorGestureFilter
-import androidx.compose.ui.platform.testTag
-import androidx.compose.foundation.Box
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.offset
-import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.ui.platform.DensityAmbient
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
import androidx.ui.test.captureToBitmap
import androidx.ui.test.createComposeRule
-import androidx.ui.test.performGesture
-import androidx.ui.test.onNodeWithTag
import androidx.ui.test.down
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.unit.dp
+import androidx.ui.test.onNodeWithTag
+import androidx.ui.test.performGesture
import org.junit.Assert
import org.junit.Rule
import org.junit.Test
@@ -65,7 +66,7 @@
val testTag = "transformedComposable"
var latch: CountDownLatch? = null
rule.setContent {
- val pressed = state { false }
+ val pressed = remember { mutableStateOf(false) }
val onStart: (Offset) -> Unit = {
pressed.value = true
}
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/WithConstraintsTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/WithConstraintsTest.kt
index 3081dba..fec4dcd 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/WithConstraintsTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/layout/WithConstraintsTest.kt
@@ -20,6 +20,8 @@
import android.graphics.Bitmap
import android.os.Build
+import androidx.compose.foundation.layout.Constraints
+import androidx.compose.foundation.layout.DpConstraints
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.emptyContent
@@ -28,40 +30,37 @@
import androidx.compose.runtime.onDispose
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
-import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.Layout
import androidx.compose.ui.LayoutModifier
import androidx.compose.ui.Measurable
import androidx.compose.ui.MeasureBlock
import androidx.compose.ui.MeasureScope
import androidx.compose.ui.Modifier
-import androidx.compose.ui.WithConstraints
-import androidx.compose.ui.drawBehind
-import androidx.compose.ui.onPositioned
-import androidx.compose.ui.test.TestActivity
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.vector.VectorPainter
-import androidx.compose.foundation.layout.Constraints
-import androidx.compose.foundation.layout.DpConstraints
import androidx.compose.ui.Padding
import androidx.compose.ui.Scroller
import androidx.compose.ui.SquareModel
+import androidx.compose.ui.WithConstraints
import androidx.compose.ui.assertRect
import androidx.compose.ui.draw.paint
+import androidx.compose.ui.drawBehind
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.vector.VectorPainter
import androidx.compose.ui.node.Ref
+import androidx.compose.ui.onPositioned
+import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
+import androidx.compose.ui.platform.DensityAmbient
+import androidx.compose.ui.platform.setContent
import androidx.compose.ui.runOnUiThreadIR
+import androidx.compose.ui.test.TestActivity
+import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.waitAndScreenShot
-import androidx.compose.ui.platform.AndroidOwnerExtraAssertionsRule
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.platform.setContent
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Before
@@ -421,7 +420,7 @@
// this replicates the popular pattern we currently use
// where we save some data calculated in the measuring block
// and then use it in the next composition frame
- var model by state { false }
+ var model by remember { mutableStateOf(false) }
Layout({
if (model) {
latch.countDown()
@@ -498,7 +497,7 @@
val drawlatch = CountDownLatch(1)
rule.runOnUiThread {
activity.setContent {
- val state = state { false }
+ val state = remember { mutableStateOf(false) }
var lastLayoutValue: Boolean = false
val drawModifier = Modifier.drawBehind {
// this verifies the layout was remeasured before being drawn
@@ -580,7 +579,7 @@
fun triggerRootRemeasureWhileRootIsLayouting() {
rule.runOnUiThread {
activity.setContent {
- val state = state { 0 }
+ val state = remember { mutableStateOf(0) }
ContainerChildrenAffectsParentSize(100, 100) {
WithConstraints {
Layout(
diff --git a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt
index 76daa56..7494eb1 100644
--- a/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt
+++ b/ui/ui-core/src/androidAndroidTest/kotlin/androidx/compose/ui/window/DialogUiTest.kt
@@ -19,17 +19,18 @@
import androidx.compose.foundation.clickable
import androidx.compose.runtime.Providers
import androidx.compose.runtime.ambientOf
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.test.espresso.Espresso
import androidx.test.filters.FlakyTest
import androidx.test.filters.MediumTest
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import androidx.test.uiautomator.UiDevice
-import androidx.compose.ui.Modifier
-import androidx.test.espresso.Espresso
import androidx.ui.test.assertIsDisplayed
import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
import androidx.ui.test.onNodeWithText
+import androidx.ui.test.performClick
import androidx.ui.test.runOnIdle
import org.junit.Assert.assertEquals
import org.junit.Ignore
@@ -49,7 +50,7 @@
@Test
fun dialogTest_isShowingContent() {
composeTestRule.setContent {
- val showDialog = state { true }
+ val showDialog = remember { mutableStateOf(true) }
if (showDialog.value) {
Dialog(onCloseRequest = {}) {
@@ -68,8 +69,8 @@
val textAfterClick = "textAfterClick"
composeTestRule.setContent {
- val showDialog = state { true }
- val text = state { textBeforeClick }
+ val showDialog = remember { mutableStateOf(true) }
+ val text = remember { mutableStateOf(textBeforeClick) }
if (showDialog.value) {
Dialog(onCloseRequest = {
@@ -99,7 +100,7 @@
@Test
fun dialogTest_isDismissed_whenSpecified() {
composeTestRule.setContent {
- val showDialog = state { true }
+ val showDialog = remember { mutableStateOf(true) }
if (showDialog.value) {
Dialog(onCloseRequest = {
@@ -123,7 +124,7 @@
@Test
fun dialogTest_isNotDismissed_whenNotSpecified() {
composeTestRule.setContent {
- val showDialog = state { true }
+ val showDialog = remember { mutableStateOf(true) }
if (showDialog.value) {
Dialog(onCloseRequest = {}) {
@@ -146,7 +147,7 @@
@Test
fun dialogTest_isDismissed_whenSpecified_backButtonPressed() {
composeTestRule.setContent {
- val showDialog = state { true }
+ val showDialog = remember { mutableStateOf(true) }
if (showDialog.value) {
Dialog(onCloseRequest = {
@@ -171,7 +172,7 @@
@Test
fun dialogTest_isNotDismissed_whenNotSpecified_backButtonPressed() {
composeTestRule.setContent {
- val showDialog = state { true }
+ val showDialog = remember { mutableStateOf(true) }
if (showDialog.value) {
Dialog(onCloseRequest = {}) {
diff --git a/ui/ui-core/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt b/ui/ui-core/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt
index ceffb5f..d043d93 100644
--- a/ui/ui-core/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt
+++ b/ui/ui-core/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidAmbients.kt
@@ -24,12 +24,12 @@
import androidx.compose.runtime.Providers
import androidx.compose.runtime.ambientOf
import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.neverEqualPolicy
import androidx.compose.runtime.onDispose
import androidx.compose.runtime.remember
import androidx.compose.runtime.savedinstancestate.UiSavedStateRegistryAmbient
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.runtime.staticAmbientOf
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ViewModelStoreOwner
@@ -68,11 +68,12 @@
val view = owner.view
val context = view.context
- var configuration by state(
- @OptIn(ExperimentalComposeApi::class)
- neverEqualPolicy()
- ) {
- context.applicationContext.resources.configuration
+ var configuration by remember {
+ mutableStateOf(
+ context.applicationContext.resources.configuration,
+ @OptIn(ExperimentalComposeApi::class)
+ neverEqualPolicy()
+ )
}
// onConfigurationChange is the correct hook to update configuration, however it is
// possible that the configuration object itself may come from a wrapped
diff --git a/ui/ui-core/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt b/ui/ui-core/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt
index 683ff0a..4c26796 100644
--- a/ui/ui-core/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt
+++ b/ui/ui-core/src/commonMain/kotlin/androidx/compose/ui/selection/SelectionContainer.kt
@@ -18,8 +18,8 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
-import androidx.compose.runtime.state
import androidx.compose.ui.Modifier
import androidx.compose.ui.gesture.dragGestureFilter
import androidx.compose.ui.gesture.longPressDragGestureFilter
@@ -35,7 +35,7 @@
*/
@Composable
internal fun SelectionContainer(children: @Composable () -> Unit) {
- val selection = state<Selection?> { null }
+ val selection = remember { mutableStateOf<Selection?>(null) }
SelectionContainer(
selection = selection.value,
onSelectionChange = { selection.value = it },
diff --git a/ui/ui-core/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt b/ui/ui-core/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt
index 9ab400e..8c46e50 100644
--- a/ui/ui-core/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt
+++ b/ui/ui-core/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelection.kt
@@ -17,8 +17,8 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
-import androidx.compose.runtime.state
import androidx.compose.ui.Layout
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
@@ -58,7 +58,7 @@
@Composable
internal fun DesktopSelectionContainer(children: @Composable () -> Unit) {
- val selection = state<Selection?> { null }
+ val selection = remember { mutableStateOf<Selection?>(null) }
DesktopSelectionContainer(
selection = selection.value,
onSelectionChange = { selection.value = it },
diff --git a/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/example1/Main.kt b/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/example1/Main.kt
index 6f1ab0b..8a123ab 100644
--- a/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/example1/Main.kt
+++ b/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/example1/Main.kt
@@ -32,10 +32,12 @@
import androidx.compose.material.Slider
import androidx.compose.material.TextField
import androidx.compose.material.TopAppBar
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.imageResource
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.font.fontFamily
@@ -44,7 +46,6 @@
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.ui.desktop.AppWindow
-import androidx.compose.ui.res.imageResource
private const val title = "Desktop Compose Elements"
@@ -67,9 +68,11 @@
)
},
bodyContent = {
- val amount = state { 0 }
- val animation = state { true }
- val text = state { "Hello \uD83E\uDDD1\uD83C\uDFFF\u200D\uD83E\uDDB0\nПривет" }
+ val amount = remember { mutableStateOf(0) }
+ val animation = remember { mutableStateOf(true) }
+ val text = remember {
+ mutableStateOf("Hello \uD83E\uDDD1\uD83C\uDFFF\u200D\uD83E\uDDB0\nПривет")
+ }
Column(Modifier.fillMaxSize(), Arrangement.SpaceEvenly) {
Text(
text = "Привет! 你好! Desktop Compose ${amount.value}",
diff --git a/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/popupexample/AppContent.kt b/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/popupexample/AppContent.kt
index 7a283f0..716f3da 100644
--- a/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/popupexample/AppContent.kt
+++ b/ui/ui-desktop/samples/src/jvmMain/kotlin/androidx/ui/desktop/examples/popupexample/AppContent.kt
@@ -33,7 +33,8 @@
import androidx.compose.material.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@@ -48,9 +49,9 @@
@Composable
fun content() {
- val popupState = state { false }
- val dialogState = state { false }
- val amount = state { 0 }
+ val popupState = remember { mutableStateOf(false) }
+ val dialogState = remember { mutableStateOf(false) }
+ val amount = remember { mutableStateOf(0) }
Surface(
modifier = Modifier.fillMaxSize(),
diff --git a/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt b/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
index 8e0bcb0..95be524 100644
--- a/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
+++ b/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/ListDemos.kt
@@ -16,14 +16,6 @@
package androidx.compose.foundation.demos
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Providers
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.ui.demos.common.ComposableDemo
import androidx.compose.foundation.Box
import androidx.compose.foundation.ContentColorAmbient
import androidx.compose.foundation.ContentGravity
@@ -31,8 +23,6 @@
import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.currentTextStyle
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
@@ -41,17 +31,27 @@
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.preferredWidth
import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.lazy.ExperimentalLazyDsl
+import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyColumnFor
import androidx.compose.foundation.lazy.LazyColumnForIndexed
+import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.LazyRowFor
import androidx.compose.foundation.lazy.LazyRowForIndexed
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Providers
+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.Color
import androidx.compose.ui.platform.LayoutDirectionAmbient
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
-import androidx.compose.foundation.lazy.ExperimentalLazyDsl
-import androidx.compose.foundation.lazy.LazyColumn
-import androidx.compose.foundation.lazy.LazyRow
+import androidx.ui.demos.common.ComposableDemo
import kotlin.random.Random
val LazyListDemos = listOf(
@@ -84,8 +84,8 @@
@Composable
private fun ListAddRemoveItemsDemo() {
- var numItems by state { 0 }
- var offset by state { 0 }
+ var numItems by remember { mutableStateOf(0) }
+ var offset by remember { mutableStateOf(0) }
Column {
Row {
val buttonModifier = Modifier.padding(8.dp)
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableSamples.kt
index 0084d33..6c7d3bb 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableSamples.kt
@@ -17,16 +17,17 @@
package androidx.compose.foundation.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Text
import androidx.compose.foundation.clickable
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
@Sampled
@Composable
fun ClickableSample() {
- val count = state { 0 }
+ val count = remember { mutableStateOf(0) }
// content that you want to make clickable
Text(text = count.value.toString(), modifier = Modifier.clickable { count.value += 1 })
}
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt
index b32d069..4895037 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ClickableTextSample.kt
@@ -18,12 +18,13 @@
import android.util.Log
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.longPressGestureFilter
import androidx.compose.foundation.ClickableText
import androidx.compose.foundation.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.longPressGestureFilter
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.TextLayoutResult
import androidx.compose.ui.text.TextStyle
@@ -52,7 +53,7 @@
onTextLayout: (TextLayoutResult) -> Unit = {},
onLongClick: (offset: Int) -> Unit
) {
- val layoutResult = state<TextLayoutResult?> { null }
+ val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
val gesture = Modifier.longPressGestureFilter(
onLongPress = { pos ->
layoutResult.value?.let { layout ->
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt
index 82dce3d..d900db4d 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/DraggableSamples.kt
@@ -17,16 +17,17 @@
package androidx.compose.foundation.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
import androidx.compose.foundation.Box
import androidx.compose.foundation.gestures.draggable
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.offsetPx
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.preferredWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
@Sampled
@@ -37,7 +38,7 @@
val max = 300.dp
val min = 0.dp
// this is the state we will update while dragging
- val offsetPosition = state { 0f }
+ val offsetPosition = remember { mutableStateOf(0f) }
// seekbar itself
Box(
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt
index c052810..737bf7b 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ScrollableSamples.kt
@@ -17,17 +17,18 @@
package androidx.compose.foundation.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
import androidx.compose.foundation.Box
import androidx.compose.foundation.ContentGravity
import androidx.compose.foundation.Text
import androidx.compose.foundation.gestures.rememberScrollableController
import androidx.compose.foundation.gestures.scrollable
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -37,7 +38,7 @@
@Composable
fun ScrollableSample() {
// actual composable state
- val offset = state { 0f }
+ val offset = remember { mutableStateOf(0f) }
// state for Scrollable, describes how to consume scrolling delta and update offset
Box(
Modifier
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt
index 14c3db3..a7b43ac 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/SelectableSamples.kt
@@ -17,19 +17,20 @@
package androidx.compose.foundation.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
-import androidx.compose.foundation.selection.selectable
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.selection.selectable
+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.Color
import androidx.compose.ui.unit.dp
@Sampled
@@ -37,7 +38,7 @@
fun SelectableSample() {
val option1 = Color.Red
val option2 = Color.Blue
- var selectedOption by state { option1 }
+ var selectedOption by remember { mutableStateOf(option1) }
Column {
Text("Selected: $selectedOption")
Row {
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt
index d5f5716..fd4d2d4 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ToggleableSamples.kt
@@ -17,20 +17,21 @@
package androidx.compose.foundation.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Text
import androidx.compose.foundation.selection.ToggleableState
import androidx.compose.foundation.selection.toggleable
import androidx.compose.foundation.selection.triStateToggleable
+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
@Sampled
@Composable
fun ToggleableSample() {
- var checked by state { false }
+ var checked by remember { mutableStateOf(false) }
// content that you want to make toggleable
Text(
modifier = Modifier.toggleable(value = checked, onValueChange = { checked = it }),
@@ -41,7 +42,7 @@
@Sampled
@Composable
fun TriStateToggleableSample() {
- var checked by state { ToggleableState.Indeterminate }
+ var checked by remember { mutableStateOf(ToggleableState.Indeterminate) }
// content that you want to make toggleable
Text(
modifier = Modifier.triStateToggleable(
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt
index 1bf2159..73df2b1 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/compose/foundation/samples/ZoomableSample.kt
@@ -17,7 +17,6 @@
package androidx.compose.foundation.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
import androidx.compose.foundation.Box
import androidx.compose.foundation.ContentGravity
import androidx.compose.foundation.Text
@@ -27,10 +26,11 @@
import androidx.compose.foundation.gestures.zoomable
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredSize
+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.runtime.state
-import androidx.compose.runtime.structuralEqualityPolicy
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.drawLayer
@@ -45,7 +45,7 @@
Modifier.preferredSize(300.dp).clipToBounds(),
backgroundColor = Color.LightGray
) {
- var scale by state(structuralEqualityPolicy()) { 1f }
+ var scale by remember { mutableStateOf(1f) }
val zoomableController = rememberZoomableController { scale *= it }
Box(
Modifier
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
index f9e9ce0..9fde616 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
@@ -16,29 +16,29 @@
package androidx.compose.foundation
+import androidx.compose.foundation.layout.Stack
+import androidx.compose.foundation.selection.selectable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
import androidx.compose.ui.Modifier
-import androidx.compose.foundation.selection.selectable
-import androidx.compose.foundation.layout.Stack
+import androidx.test.filters.MediumTest
import androidx.ui.test.assertCountEquals
import androidx.ui.test.assertIsInMutuallyExclusiveGroup
-import androidx.ui.test.assertIsSelected
import androidx.ui.test.assertIsNotSelected
+import androidx.ui.test.assertIsSelected
import androidx.ui.test.center
import androidx.ui.test.createComposeRule
+import androidx.ui.test.down
+import androidx.ui.test.isInMutuallyExclusiveGroup
+import androidx.ui.test.onAllNodes
+import androidx.ui.test.onFirst
+import androidx.ui.test.onNode
+import androidx.ui.test.onNodeWithText
import androidx.ui.test.performClick
import androidx.ui.test.performGesture
-import androidx.ui.test.onNode
-import androidx.ui.test.onAllNodes
-import androidx.ui.test.onNodeWithText
-import androidx.ui.test.onFirst
-import androidx.ui.test.isInMutuallyExclusiveGroup
import androidx.ui.test.runOnIdle
-import androidx.ui.test.down
import androidx.ui.test.up
import com.google.common.truth.Truth
import org.junit.Rule
@@ -72,7 +72,7 @@
@Test
fun selectable_defaultClicks() {
composeTestRule.setContent {
- val (selected, onSelected) = state { false }
+ val (selected, onSelected) = remember { mutableStateOf(false) }
Text(
"Text in item",
modifier = Modifier.selectable(
@@ -93,7 +93,7 @@
@Test
fun selectable_noClicksNoChanges() {
composeTestRule.setContent {
- val (selected, _) = state { false }
+ val (selected, _) = remember { mutableStateOf(false) }
Text(
"Text in item",
modifier = Modifier.selectable(
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SoftwareKeyboardTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SoftwareKeyboardTest.kt
index 20c385b..290ef9a 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SoftwareKeyboardTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SoftwareKeyboardTest.kt
@@ -16,20 +16,21 @@
package androidx.compose.foundation
+import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Providers
-import androidx.compose.runtime.state
-import androidx.test.filters.SmallTest
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.TextInputServiceAmbient
+import androidx.compose.ui.text.SoftwareKeyboardController
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.TextInputService
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.ui.platform.TextInputServiceAmbient
+import androidx.test.filters.SmallTest
import androidx.ui.test.createComposeRule
import androidx.ui.test.hasInputMethodsSupport
import androidx.ui.test.onNode
import androidx.ui.test.performClick
import androidx.ui.test.runOnIdle
-import androidx.compose.ui.text.SoftwareKeyboardController
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.mock
import com.nhaarman.mockitokotlin2.times
@@ -60,7 +61,7 @@
Providers(
TextInputServiceAmbient provides textInputService
) {
- val state = state { TextFieldValue("") }
+ val state = remember { mutableStateOf(TextFieldValue("")) }
BaseTextField(
value = state.value,
modifier = Modifier.fillMaxSize(),
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldFocusTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldFocusTest.kt
index b8b51c1..23d4727 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldFocusTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldFocusTest.kt
@@ -16,19 +16,20 @@
package androidx.compose.foundation
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.text.CoreTextField
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.test.annotation.UiThreadTest
-import androidx.test.filters.LargeTest
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.FocusModifier
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.foundation.layout.width
+import androidx.compose.ui.unit.dp
+import androidx.test.annotation.UiThreadTest
+import androidx.test.filters.LargeTest
import androidx.ui.test.createComposeRule
import androidx.ui.test.runOnIdle
import androidx.ui.test.runOnUiThread
-import androidx.compose.foundation.text.CoreTextField
-import androidx.compose.ui.FocusModifier
-import androidx.compose.ui.unit.dp
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
import org.junit.Test
@@ -46,7 +47,7 @@
@Composable
private fun TextFieldApp(dataList: List<FocusTestData>) {
for (data in dataList) {
- val editor = state { TextFieldValue() }
+ val editor = remember { mutableStateOf(TextFieldValue()) }
CoreTextField(
value = editor.value,
modifier = Modifier.width(10.dp).then(data.id),
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldOnValueChangeTextFieldValueTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
index 5ed6084..0460894 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldOnValueChangeTextFieldValueTest.kt
@@ -17,10 +17,11 @@
package androidx.compose.foundation
import androidx.compose.runtime.Providers
-import androidx.compose.runtime.state
-import androidx.test.filters.SmallTest
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.platform.TextInputServiceAmbient
+import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.CommitTextEditOp
import androidx.compose.ui.text.input.DeleteSurroundingTextEditOp
import androidx.compose.ui.text.input.EditOperation
@@ -29,14 +30,14 @@
import androidx.compose.ui.text.input.SetComposingTextEditOp
import androidx.compose.ui.text.input.SetSelectionEditOp
import androidx.compose.ui.text.input.TextInputService
+import androidx.test.filters.SmallTest
+import androidx.ui.test.click
import androidx.ui.test.createComposeRule
-import androidx.ui.test.performGesture
-import androidx.ui.test.onNode
import androidx.ui.test.hasInputMethodsSupport
+import androidx.ui.test.onNode
+import androidx.ui.test.performGesture
import androidx.ui.test.runOnIdle
import androidx.ui.test.runOnUiThread
-import androidx.ui.test.click
-import androidx.compose.ui.text.TextRange
import com.google.common.truth.Truth.assertThat
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.argumentCaptor
@@ -75,10 +76,12 @@
Providers(
TextInputServiceAmbient provides textInputService
) {
- val state = state {
- androidx.compose.ui.text.input.TextFieldValue(
- "abcde",
- TextRange.Zero
+ val state = remember {
+ mutableStateOf(
+ androidx.compose.ui.text.input.TextFieldValue(
+ "abcde",
+ TextRange.Zero
+ )
)
}
BaseTextField(
diff --git a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldTest.kt b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldTest.kt
index 4abb81a..d8128f2 100644
--- a/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldTest.kt
+++ b/ui/ui-foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/TextFieldTest.kt
@@ -20,29 +20,30 @@
package androidx.compose.foundation
import android.os.Build
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.Providers
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.preferredWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.Providers
import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.runtime.savedinstancestate.savedInstanceState
-import androidx.compose.runtime.state
+import androidx.compose.runtime.setValue
import androidx.compose.ui.FocusModifier
-import androidx.compose.ui.text.AnnotatedString
-import androidx.test.filters.SdkSuppress
-import androidx.test.filters.SmallTest
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusState
import androidx.compose.ui.focusState
-import androidx.compose.ui.onPositioned
-import androidx.compose.ui.platform.testTag
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.onPositioned
import androidx.compose.ui.platform.TextInputServiceAmbient
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.TextLayoutResult
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.CommitTextEditOp
@@ -52,8 +53,9 @@
import androidx.compose.ui.text.input.TextFieldValue.Companion.Saver
import androidx.compose.ui.text.input.TextInputService
import androidx.compose.ui.text.length
-import androidx.compose.ui.semantics.SemanticsActions
-import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.SmallTest
import androidx.ui.test.SemanticsMatcher
import androidx.ui.test.StateRestorationTester
import androidx.ui.test.assert
@@ -62,16 +64,15 @@
import androidx.ui.test.assertTextEquals
import androidx.ui.test.captureToBitmap
import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.onNode
-import androidx.ui.test.onNodeWithTag
import androidx.ui.test.hasImeAction
import androidx.ui.test.hasInputMethodsSupport
import androidx.ui.test.isFocused
import androidx.ui.test.isNotFocused
+import androidx.ui.test.onNode
+import androidx.ui.test.onNodeWithTag
+import androidx.ui.test.performClick
import androidx.ui.test.performSemanticsAction
import androidx.ui.test.runOnIdle
-import androidx.compose.ui.unit.dp
import com.google.common.truth.Truth.assertThat
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.argumentCaptor
@@ -103,7 +104,7 @@
lateinit var focusModifier: FocusModifier
composeTestRule.setContent {
- val state = state { TextFieldValue("") }
+ val state = remember { mutableStateOf(TextFieldValue("")) }
Providers(
TextInputServiceAmbient provides inputService
) {
@@ -126,7 +127,7 @@
@Composable
private fun TextFieldApp() {
- val state = state { TextFieldValue("") }
+ val state = remember { mutableStateOf(TextFieldValue("")) }
BaseTextField(
value = state.value,
modifier = Modifier.fillMaxSize(),
@@ -196,7 +197,7 @@
@Composable
private fun OnlyDigitsApp() {
- val state = state { TextFieldValue("") }
+ val state = remember { mutableStateOf(TextFieldValue("")) }
BaseTextField(
value = state.value,
modifier = Modifier.fillMaxSize(),
@@ -280,7 +281,7 @@
Providers(
TextInputServiceAmbient provides textInputService
) {
- val state = state { TextFieldValue("") }
+ val state = remember { mutableStateOf(TextFieldValue("")) }
BaseTextField(
value = state.value,
modifier = Modifier.fillMaxSize(),
@@ -483,7 +484,7 @@
@Test
fun semantics_clickAction() {
composeTestRule.setContent {
- var value by state { TextFieldValue() }
+ var value by remember { mutableStateOf(TextFieldValue()) }
BaseTextField(
modifier = Modifier.testTag("textField"),
value = value,
@@ -501,7 +502,7 @@
@Test
fun semantics_setTextSetSelectionActions() {
composeTestRule.setContent {
- var value by state { TextFieldValue() }
+ var value by remember { mutableStateOf(TextFieldValue()) }
BaseTextField(
modifier = Modifier.testTag("textField"),
value = value,
diff --git a/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt b/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
index e0330cd..62e95f6 100644
--- a/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
+++ b/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/BaseTextField.kt
@@ -16,10 +16,14 @@
package androidx.compose.foundation
+import androidx.compose.animation.animatedColor
import androidx.compose.animation.core.AnimatedValue
import androidx.compose.animation.core.AnimationConstants.Infinite
import androidx.compose.animation.core.keyframes
import androidx.compose.animation.core.repeatable
+import androidx.compose.foundation.layout.defaultMinSizeConstraints
+import androidx.compose.foundation.text.CoreTextField
+import androidx.compose.foundation.text.TextFieldDelegate
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.State
@@ -28,8 +32,6 @@
import androidx.compose.runtime.onCommit
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.animation.animatedColor
import androidx.compose.ui.ContentDrawScope
import androidx.compose.ui.DrawModifier
import androidx.compose.ui.Modifier
@@ -38,19 +40,16 @@
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.useOrElse
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.InternalTextApi
+import androidx.compose.ui.text.SoftwareKeyboardController
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.constrain
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation
-import androidx.compose.foundation.layout.defaultMinSizeConstraints
-import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.foundation.text.CoreTextField
-import androidx.compose.ui.text.InternalTextApi
-import androidx.compose.ui.text.SoftwareKeyboardController
-import androidx.compose.foundation.text.TextFieldDelegate
-import androidx.compose.ui.text.TextLayoutResult
-import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.constrain
import androidx.compose.ui.unit.dp
// TODO(b/151940543): Remove this variable when we have a solution for idling animations
@@ -138,7 +137,7 @@
onTextInputStarted: (SoftwareKeyboardController) -> Unit = {},
cursorColor: Color = contentColor()
) {
- val fullModel = state { TextFieldValue() }
+ val fullModel = remember { mutableStateOf(TextFieldValue()) }
if (fullModel.value != value) {
@OptIn(InternalTextApi::class)
fullModel.value = TextFieldValue(
diff --git a/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/ClickableText.kt b/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/ClickableText.kt
index 7381145..1b30294 100644
--- a/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/ClickableText.kt
+++ b/ui/ui-foundation/src/commonMain/kotlin/androidx/compose/foundation/ClickableText.kt
@@ -16,7 +16,8 @@
package androidx.compose.foundation
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.gesture.pressIndicatorGestureFilter
import androidx.compose.ui.gesture.tapGestureFilter
@@ -66,7 +67,7 @@
onTextLayout: (TextLayoutResult) -> Unit = {},
onClick: (Int) -> Unit
) {
- val layoutResult = state<TextLayoutResult?> { null }
+ val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
val pressIndicator = Modifier.tapGestureFilter { pos ->
layoutResult.value?.let { layoutResult ->
onClick(layoutResult.getOffsetForPosition(pos))
diff --git a/ui/ui-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt b/ui/ui-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt
index 436aec7..e0340aa 100644
--- a/ui/ui-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt
+++ b/ui/ui-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/LayoutOffsetSample.kt
@@ -17,11 +17,6 @@
package androidx.compose.foundation.layout.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.gesture.tapGestureFilter
import androidx.compose.foundation.Text
import androidx.compose.foundation.layout.absoluteOffset
import androidx.compose.foundation.layout.absoluteOffsetPx
@@ -29,6 +24,12 @@
import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.offsetPx
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.gesture.tapGestureFilter
import androidx.compose.ui.unit.dp
@Sampled
@@ -61,7 +62,7 @@
fun LayoutOffsetPxModifier() {
// This text will be offset in steps of 10.dp from the top left of the available space in
// left-to-right context, and from top right in right-to-left context.
- val offset = state { 0f }
+ val offset = remember { mutableStateOf(0f) }
Text(
"Layout offset modifier sample",
Modifier
@@ -74,7 +75,7 @@
@Composable
fun LayoutAbsoluteOffsetPxModifier() {
// This text will be offset in steps of 10.dp from the top left of the available space.
- val offset = state { 0f }
+ val offset = remember { mutableStateOf(0f) }
Text(
"Layout offset modifier sample",
Modifier
diff --git a/ui/ui-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutOffsetTest.kt b/ui/ui-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutOffsetTest.kt
index ba9821c..8217b21 100644
--- a/ui/ui-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutOffsetTest.kt
+++ b/ui/ui-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/LayoutOffsetTest.kt
@@ -17,22 +17,23 @@
package androidx.compose.foundation.layout
import android.os.Build
-import androidx.compose.runtime.state
-import androidx.test.filters.SmallTest
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
-import androidx.compose.ui.onPositioned
import androidx.compose.foundation.Box
import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.LayoutCoordinates
import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.onPositioned
import androidx.compose.ui.platform.LayoutDirectionAmbient
+import androidx.compose.ui.platform.testTag
import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.SmallTest
import androidx.ui.test.createComposeRule
import androidx.ui.test.onNodeWithTag
import androidx.ui.test.runOnIdle
-import androidx.compose.ui.unit.dp
import org.junit.Assert
import org.junit.Assume
import org.junit.Before
@@ -186,7 +187,10 @@
Stack(
Modifier.testTag("stack")
.wrapContentSize(Alignment.TopStart)
- .offsetPx(state { offsetX }, state { offsetY })
+ .offsetPx(
+ remember { mutableStateOf(offsetX) },
+ remember { mutableStateOf(offsetY) }
+ )
.onPositioned { coordinates: LayoutCoordinates ->
positionX = coordinates.positionInRoot.x
positionY = coordinates.positionInRoot.y
@@ -217,7 +221,10 @@
.wrapContentSize(Alignment.TopEnd)
.preferredWidth(containerWidth)
.wrapContentSize(Alignment.TopStart)
- .offsetPx(state { offsetX }, state { offsetY })
+ .offsetPx(
+ remember { mutableStateOf(offsetX) },
+ remember { mutableStateOf(offsetY) }
+ )
.onPositioned { coordinates: LayoutCoordinates ->
positionX = coordinates.positionInRoot.x
positionY = coordinates.positionInRoot.y
@@ -249,7 +256,10 @@
Stack(
Modifier.testTag("stack")
.wrapContentSize(Alignment.TopStart)
- .absoluteOffsetPx(state { offsetX }, state { offsetY })
+ .absoluteOffsetPx(
+ remember { mutableStateOf(offsetX) },
+ remember { mutableStateOf(offsetY) }
+ )
.onPositioned { coordinates: LayoutCoordinates ->
positionX = coordinates.positionInRoot.x
positionY = coordinates.positionInRoot.y
@@ -280,7 +290,10 @@
.wrapContentSize(Alignment.TopEnd)
.preferredWidth(containerWidth)
.wrapContentSize(Alignment.TopStart)
- .absoluteOffsetPx(state { offsetX }, state { offsetY })
+ .absoluteOffsetPx(
+ remember { mutableStateOf(offsetX) },
+ remember { mutableStateOf(offsetY) }
+ )
.onPositioned { coordinates: LayoutCoordinates ->
positionX = coordinates.positionInRoot.x
positionY = coordinates.positionInRoot.y
diff --git a/ui/ui-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt b/ui/ui-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
index 9eb3d67..7fc3617 100644
--- a/ui/ui-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
+++ b/ui/ui-livedata/src/main/java/androidx/compose/runtime/livedata/LiveDataAdapter.kt
@@ -18,8 +18,9 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.onPreCommit
-import androidx.compose.runtime.state
+import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LifecycleOwnerAmbient
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
@@ -53,7 +54,7 @@
@Composable
fun <R, T : R> LiveData<T>.observeAsState(initial: R): State<R> {
val lifecycleOwner = LifecycleOwnerAmbient.current
- val state = state { initial }
+ val state = remember { mutableStateOf(initial) }
onPreCommit(this, lifecycleOwner) {
val observer = Observer<T> { state.value = it }
observe(lifecycleOwner, observer)
diff --git a/ui/ui-material/api/current.txt b/ui/ui-material/api/current.txt
index 8e2644e..84728d8 100644
--- a/ui/ui-material/api/current.txt
+++ b/ui/ui-material/api/current.txt
@@ -351,11 +351,11 @@
method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fixedThresholds-0680j_4(float offset);
method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fractionalThresholds(@FloatRange(from=0.0, to=1.0) float fraction);
method @androidx.compose.material.ExperimentalMaterialApi public static <T> androidx.compose.ui.Modifier swipeable(androidx.compose.ui.Modifier, androidx.compose.material.SwipeableState<T> state, java.util.Map<java.lang.Float,? extends T> anchors, kotlin.jvm.functions.Function3<? super androidx.compose.ui.unit.Density,? super java.lang.Float,? super java.lang.Float,java.lang.Float> thresholds, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, boolean enabled = true, boolean reverseDirection = false, float minValue = elvis {
- var varf5a37ed0: <ErrorType> = anchors.keys.<anonymous class>()
- if (varf5a37ed0 != null) varf5a37ed0 else Float.NEGATIVE_INFINITY
+ var varf5a37bc5: <ErrorType> = anchors.keys.<anonymous class>()
+ if (varf5a37bc5 != null) varf5a37bc5 else Float.NEGATIVE_INFINITY
}, float maxValue = elvis {
- var var1e0457e5: <ErrorType> = anchors.keys.<anonymous class>()
- if (var1e0457e5 != null) var1e0457e5 else Float.POSITIVE_INFINITY
+ var var1e0454da: <ErrorType> = anchors.keys.<anonymous class>()
+ if (var1e0454da != null) var1e0454da else Float.POSITIVE_INFINITY
}, androidx.compose.foundation.InteractionState? interactionState = null);
}
diff --git a/ui/ui-material/api/public_plus_experimental_current.txt b/ui/ui-material/api/public_plus_experimental_current.txt
index 8e2644e..84728d8 100644
--- a/ui/ui-material/api/public_plus_experimental_current.txt
+++ b/ui/ui-material/api/public_plus_experimental_current.txt
@@ -351,11 +351,11 @@
method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fixedThresholds-0680j_4(float offset);
method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fractionalThresholds(@FloatRange(from=0.0, to=1.0) float fraction);
method @androidx.compose.material.ExperimentalMaterialApi public static <T> androidx.compose.ui.Modifier swipeable(androidx.compose.ui.Modifier, androidx.compose.material.SwipeableState<T> state, java.util.Map<java.lang.Float,? extends T> anchors, kotlin.jvm.functions.Function3<? super androidx.compose.ui.unit.Density,? super java.lang.Float,? super java.lang.Float,java.lang.Float> thresholds, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, boolean enabled = true, boolean reverseDirection = false, float minValue = elvis {
- var varf5a37ed0: <ErrorType> = anchors.keys.<anonymous class>()
- if (varf5a37ed0 != null) varf5a37ed0 else Float.NEGATIVE_INFINITY
+ var varf5a37bc5: <ErrorType> = anchors.keys.<anonymous class>()
+ if (varf5a37bc5 != null) varf5a37bc5 else Float.NEGATIVE_INFINITY
}, float maxValue = elvis {
- var var1e0457e5: <ErrorType> = anchors.keys.<anonymous class>()
- if (var1e0457e5 != null) var1e0457e5 else Float.POSITIVE_INFINITY
+ var var1e0454da: <ErrorType> = anchors.keys.<anonymous class>()
+ if (var1e0454da != null) var1e0454da else Float.POSITIVE_INFINITY
}, androidx.compose.foundation.InteractionState? interactionState = null);
}
diff --git a/ui/ui-material/api/restricted_current.txt b/ui/ui-material/api/restricted_current.txt
index 8e2644e..84728d8 100644
--- a/ui/ui-material/api/restricted_current.txt
+++ b/ui/ui-material/api/restricted_current.txt
@@ -351,11 +351,11 @@
method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fixedThresholds-0680j_4(float offset);
method @androidx.compose.material.ExperimentalMaterialApi public static kotlin.jvm.functions.Function3<androidx.compose.ui.unit.Density,java.lang.Float,java.lang.Float,java.lang.Float> fractionalThresholds(@FloatRange(from=0.0, to=1.0) float fraction);
method @androidx.compose.material.ExperimentalMaterialApi public static <T> androidx.compose.ui.Modifier swipeable(androidx.compose.ui.Modifier, androidx.compose.material.SwipeableState<T> state, java.util.Map<java.lang.Float,? extends T> anchors, kotlin.jvm.functions.Function3<? super androidx.compose.ui.unit.Density,? super java.lang.Float,? super java.lang.Float,java.lang.Float> thresholds, androidx.compose.ui.gesture.scrollorientationlocking.Orientation orientation, boolean enabled = true, boolean reverseDirection = false, float minValue = elvis {
- var varf5a37ed0: <ErrorType> = anchors.keys.<anonymous class>()
- if (varf5a37ed0 != null) varf5a37ed0 else Float.NEGATIVE_INFINITY
+ var varf5a37bc5: <ErrorType> = anchors.keys.<anonymous class>()
+ if (varf5a37bc5 != null) varf5a37bc5 else Float.NEGATIVE_INFINITY
}, float maxValue = elvis {
- var var1e0457e5: <ErrorType> = anchors.keys.<anonymous class>()
- if (var1e0457e5 != null) var1e0457e5 else Float.POSITIVE_INFINITY
+ var var1e0454da: <ErrorType> = anchors.keys.<anonymous class>()
+ if (var1e0454da != null) var1e0454da else Float.POSITIVE_INFINITY
}, androidx.compose.foundation.InteractionState? interactionState = null);
}
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
index fe6361e..bc15bab 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/BottomNavigationDemo.kt
@@ -16,14 +16,7 @@
package androidx.compose.material.demos
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Text
-import androidx.compose.foundation.selection.selectable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
@@ -32,14 +25,22 @@
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.selection.selectable
import androidx.compose.material.RadioButton
import androidx.compose.material.samples.BottomNavigationSample
import androidx.compose.material.samples.BottomNavigationWithOnlySelectedLabelsSample
+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.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Composable
fun BottomNavigationDemo() {
- var alwaysShowLabels by state { false }
+ var alwaysShowLabels by remember { mutableStateOf(false) }
Column(Modifier.fillMaxHeight(), verticalArrangement = Arrangement.Bottom) {
Row(
modifier = Modifier
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
index a982bc0..c2e5483 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ColorPickerDemo.kt
@@ -17,41 +17,17 @@
package androidx.compose.material.demos
import android.graphics.SweepGradient
+import androidx.compose.animation.DpPropKey
import androidx.compose.animation.core.FloatPropKey
import androidx.compose.animation.core.transitionDefinition
import androidx.compose.animation.core.tween
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.emptyContent
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.animation.DpPropKey
import androidx.compose.animation.transition
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.WithConstraints
-import androidx.compose.ui.draw.drawOpacity
-import androidx.compose.ui.gesture.DragObserver
-import androidx.compose.ui.gesture.dragGestureFilter
import androidx.compose.foundation.Border
import androidx.compose.foundation.Box
import androidx.compose.foundation.ContentGravity
import androidx.compose.foundation.Image
import androidx.compose.foundation.Text
import androidx.compose.foundation.currentTextStyle
-import androidx.compose.foundation.shape.GenericShape
-import androidx.compose.foundation.shape.CircleShape
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Radius
-import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.ImageAsset
-import androidx.compose.ui.graphics.Paint
-import androidx.compose.ui.graphics.SolidColor
-import androidx.compose.ui.graphics.isSet
-import androidx.compose.ui.graphics.toArgb
-import androidx.compose.ui.graphics.toPixelMap
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
@@ -64,9 +40,33 @@
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.foundation.shape.CircleShape
+import androidx.compose.foundation.shape.GenericShape
import androidx.compose.material.Surface
import androidx.compose.material.TopAppBar
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.emptyContent
+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.WithConstraints
+import androidx.compose.ui.draw.drawOpacity
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.geometry.Radius
import androidx.compose.ui.geometry.RoundRect
+import androidx.compose.ui.gesture.DragObserver
+import androidx.compose.ui.gesture.dragGestureFilter
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.ImageAsset
+import androidx.compose.ui.graphics.Paint
+import androidx.compose.ui.graphics.SolidColor
+import androidx.compose.ui.graphics.isSet
+import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.graphics.toPixelMap
+import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
@@ -79,7 +79,7 @@
*/
@Composable
fun ColorPickerDemo() {
- var primary by state { Color(0xFF6200EE) }
+ var primary by remember { mutableStateOf(Color(0xFF6200EE)) }
Surface(color = Color(0xFF121212)) {
Column {
TopAppBar(title = { Text("Color Picker") }, backgroundColor = primary)
@@ -96,10 +96,10 @@
.aspectRatio(1f)
) {
val diameter = constraints.maxWidth
- var position by state { Offset.Zero }
+ var position by remember { mutableStateOf(Offset.Zero) }
val colorWheel = remember(diameter) { ColorWheel(diameter) }
- var isDragging by state { false }
+ var isDragging by remember { mutableStateOf(false) }
val inputModifier = SimplePointerInput(
position = position,
onPositionChange = { newPosition ->
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
index ffaf410..683a73c 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MenuDemo.kt
@@ -16,25 +16,26 @@
package androidx.compose.material.demos
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Icon
import androidx.compose.foundation.Text
+import androidx.compose.foundation.layout.Stack
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.wrapContentSize
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.foundation.layout.Stack
import androidx.compose.material.DropdownMenu
import androidx.compose.material.DropdownMenuItem
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.MoreVert
+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.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.Position
import androidx.compose.ui.unit.dp
import kotlin.math.roundToInt
@@ -72,7 +73,7 @@
"Signout"
)
- var expanded by state { false }
+ var expanded by remember { mutableStateOf(false) }
val iconButton = @Composable {
IconButton(onClick = { expanded = true }) {
diff --git a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt
index ae4a45b..4b5f996 100644
--- a/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt
+++ b/ui/ui-material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/TabDemo.kt
@@ -16,13 +16,8 @@
package androidx.compose.material.demos
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.ScrollableColumn
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.preferredHeight
@@ -35,12 +30,18 @@
import androidx.compose.material.samples.ScrollingTextTabs
import androidx.compose.material.samples.TextAndIconTabs
import androidx.compose.material.samples.TextTabs
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
@Composable
fun TabDemo() {
ScrollableColumn {
- val showingSimple = state { true }
+ val showingSimple = remember { mutableStateOf(true) }
val buttonText = "Show ${if (showingSimple.value) "custom" else "simple"} tabs"
Spacer(Modifier.height(24.dp))
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/OverviewScreen.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/OverviewScreen.kt
index 07cb41e..a8fa3c5 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/OverviewScreen.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/OverviewScreen.kt
@@ -17,12 +17,6 @@
package androidx.compose.material.studies.rally
import android.annotation.SuppressLint
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.ScrollableColumn
import androidx.compose.foundation.Text
import androidx.compose.foundation.layout.Arrangement
@@ -39,6 +33,13 @@
import androidx.compose.material.MaterialTheme
import androidx.compose.material.TextButton
import androidx.compose.material.icons.Icons
+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.Alignment
+import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import java.util.Locale
@@ -58,7 +59,7 @@
*/
@Composable
private fun AlertCard() {
- var openDialog by state { false }
+ var openDialog by remember { mutableStateOf(false) }
val alertMessage = "Heads up, you've used up 90% of your Shopping budget for this month."
if (openDialog) {
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyActivity.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyActivity.kt
index 6ae0a03..1dfc1a4 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyActivity.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/compose/material/studies/rally/RallyActivity.kt
@@ -18,15 +18,16 @@
import android.os.Bundle
import androidx.activity.ComponentActivity
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.setContent
import androidx.compose.foundation.Box
import androidx.compose.foundation.layout.padding
import androidx.compose.material.Scaffold
+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.platform.setContent
/**
* This Activity recreates the Rally Material Study from
@@ -45,7 +46,7 @@
fun RallyApp() {
RallyTheme {
val allScreens = RallyScreenState.values().toList()
- var currentScreen by state { RallyScreenState.Overview }
+ var currentScreen by remember { mutableStateOf(RallyScreenState.Overview) }
Scaffold(
topBar = {
RallyTopAppBar(
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt
index b8b1421..4963f16 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/AlertDialogSample.kt
@@ -17,9 +17,6 @@
package androidx.compose.material.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Text
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
@@ -29,12 +26,16 @@
import androidx.compose.material.AlertDialogButtonLayout
import androidx.compose.material.Button
import androidx.compose.material.TextButton
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
@Sampled
@Composable
fun SideBySideAlertDialogSample() {
- val openDialog = state { true }
+ val openDialog = remember { mutableStateOf(true) }
if (openDialog.value) {
AlertDialog(
@@ -75,7 +76,7 @@
@Sampled
@Composable
fun StackedAlertDialogSample() {
- val openDialog = state { true }
+ val openDialog = remember { mutableStateOf(true) }
if (openDialog.value) {
AlertDialog(
@@ -115,7 +116,7 @@
@Sampled
@Composable
fun CustomAlertDialogSample() {
- val openDialog = state { true }
+ val openDialog = remember { mutableStateOf(true) }
if (openDialog.value) {
AlertDialog(
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/BottomNavigationSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/BottomNavigationSamples.kt
index 3373edc..2806fb3 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/BottomNavigationSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/BottomNavigationSamples.kt
@@ -17,21 +17,22 @@
package androidx.compose.material.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.foundation.Icon
import androidx.compose.foundation.Text
import androidx.compose.material.BottomNavigation
import androidx.compose.material.BottomNavigationItem
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
+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
@Sampled
@Composable
fun BottomNavigationSample() {
- var selectedItem by state { 0 }
+ var selectedItem by remember { mutableStateOf(0) }
val items = listOf("Songs", "Artists", "Playlists")
BottomNavigation {
@@ -48,7 +49,7 @@
@Composable
fun BottomNavigationWithOnlySelectedLabelsSample() {
- var selectedItem by state { 0 }
+ var selectedItem by remember { mutableStateOf(0) }
val items = listOf("Songs", "Artists", "Playlists")
BottomNavigation {
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/IconButtonSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/IconButtonSamples.kt
index a6bd23a..715be7f 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/IconButtonSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/IconButtonSamples.kt
@@ -17,17 +17,18 @@
package androidx.compose.material.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.animation.animate
import androidx.compose.foundation.Icon
-import androidx.compose.ui.graphics.Color
import androidx.compose.material.IconButton
import androidx.compose.material.IconToggleButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
+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.graphics.Color
@Sampled
@Composable
@@ -40,7 +41,7 @@
@Sampled
@Composable
fun IconToggleButtonSample() {
- var checked by state { false }
+ var checked by remember { mutableStateOf(false) }
IconToggleButton(checked = checked, onCheckedChange = { checked = it }) {
val tint = animate(if (checked) Color(0xFFEC407A) else Color(0xFFB0BEC5))
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
index 21e6bd5..d7a2d90 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/ListSamples.kt
@@ -17,21 +17,22 @@
package androidx.compose.material.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.foundation.Icon
import androidx.compose.foundation.Image
import androidx.compose.foundation.Text
import androidx.compose.foundation.contentColor
-import androidx.compose.ui.graphics.ColorFilter
-import androidx.compose.ui.graphics.ImageAsset
-import androidx.compose.ui.graphics.vector.VectorAsset
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Checkbox
import androidx.compose.material.Divider
import androidx.compose.material.ListItem
+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.graphics.ColorFilter
+import androidx.compose.ui.graphics.ImageAsset
+import androidx.compose.ui.graphics.vector.VectorAsset
@Sampled
@Composable
@@ -113,7 +114,7 @@
icon = { Image(icon40x40, colorFilter = ColorFilter.tint(contentColor())) }
)
Divider()
- var checked by state { false }
+ var checked by remember { mutableStateOf(false) }
ListItem(
text = { Text("Two line list item") },
secondaryText = { Text("Secondary text") },
@@ -236,7 +237,7 @@
secondaryText = { Text("Secondary text") },
icon = { Image(icon40x40, colorFilter = ColorFilter.tint(contentColor())) },
trailing = {
- var checked by state { false }
+ var checked by remember { mutableStateOf(false) }
Checkbox(checked, onCheckedChange = { checked = !checked })
},
onClick = {}
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
index 70e66a1..3181b86 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/MenuSamples.kt
@@ -17,12 +17,6 @@
package androidx.compose.material.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Icon
import androidx.compose.foundation.Text
import androidx.compose.foundation.layout.fillMaxSize
@@ -33,11 +27,18 @@
import androidx.compose.material.IconButton
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.MoreVert
+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.Alignment
+import androidx.compose.ui.Modifier
@Sampled
@Composable
fun MenuSample() {
- var expanded by state { false }
+ var expanded by remember { mutableStateOf(false) }
val iconButton = @Composable {
IconButton(onClick = { expanded = true }) {
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
index 34a8b74..086c235 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SelectionControlsSamples.kt
@@ -17,27 +17,27 @@
package androidx.compose.material.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Text
-import androidx.compose.foundation.selection.ToggleableState
-import androidx.compose.foundation.selection.selectable
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.preferredHeight
+import androidx.compose.foundation.selection.ToggleableState
+import androidx.compose.foundation.selection.selectable
import androidx.compose.material.Checkbox
import androidx.compose.material.MaterialTheme
import androidx.compose.material.RadioButton
import androidx.compose.material.Switch
import androidx.compose.material.TriStateCheckbox
+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.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
@Sampled
@@ -45,8 +45,8 @@
fun TriStateCheckboxSample() {
Column {
// define dependent checkboxes states
- val (state, onStateChange) = state { true }
- val (state2, onStateChange2) = state { true }
+ val (state, onStateChange) = remember { mutableStateOf(true) }
+ val (state2, onStateChange2) = remember { mutableStateOf(true) }
// TriStateCheckbox state reflects state of dependent checkboxes
val parentState = remember(state, state2) {
@@ -76,7 +76,7 @@
@Sampled
@Composable
fun CheckboxSample() {
- val checkedState = state { true }
+ val checkedState = remember { mutableStateOf(true) }
Checkbox(
checked = checkedState.value,
onCheckedChange = { checkedState.value = it }
@@ -86,7 +86,7 @@
@Sampled
@Composable
fun SwitchSample() {
- val checkedState = state { true }
+ val checkedState = remember { mutableStateOf(true) }
Switch(
checked = checkedState.value,
onCheckedChange = { checkedState.value = it }
@@ -98,7 +98,7 @@
fun RadioButtonSample() {
// we have two radio buttons and only one can be selected
// let's emulate binary choice here
- var enterTheMatrix by state { true }
+ var enterTheMatrix by remember { mutableStateOf(true) }
Row {
RadioButton(
selected = enterTheMatrix,
@@ -117,7 +117,7 @@
@Composable
fun RadioGroupSample() {
val radioOptions = listOf("Calls", "Missed", "Friends")
- val (selectedOption, onOptionSelected) = state { radioOptions[0] }
+ val (selectedOption, onOptionSelected) = remember { mutableStateOf(radioOptions[0]) }
Column {
radioOptions.forEach { text ->
Row(Modifier
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt
index 00685ac..d3b35a4 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/SliderSample.kt
@@ -17,18 +17,19 @@
package androidx.compose.material.samples
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.foundation.Text
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Slider
+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
@Sampled
@Composable
fun SliderSample() {
- var sliderPosition by state { 0f }
+ var sliderPosition by remember { mutableStateOf(0f) }
Text(text = sliderPosition.toString())
Slider(value = sliderPosition, onValueChange = { sliderPosition = it })
}
@@ -36,7 +37,7 @@
@Sampled
@Composable
fun StepsSliderSample() {
- var sliderPosition by state { 0f }
+ var sliderPosition by remember { mutableStateOf(0f) }
Text(text = sliderPosition.toString())
Slider(
value = sliderPosition,
diff --git a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt
index a9b4fd6..4e59b8f 100644
--- a/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt
+++ b/ui/ui-material/samples/src/main/java/androidx/compose/material/samples/TabSamples.kt
@@ -16,20 +16,12 @@
package androidx.compose.material.samples
-import androidx.compose.animation.core.spring
-import androidx.compose.animation.core.transitionDefinition
import androidx.annotation.Sampled
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.emptyContent
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.animation.ColorPropKey
import androidx.compose.animation.DpPropKey
+import androidx.compose.animation.core.spring
+import androidx.compose.animation.core.transitionDefinition
import androidx.compose.animation.transition
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Border
import androidx.compose.foundation.Box
import androidx.compose.foundation.ContentGravity
@@ -37,8 +29,6 @@
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
import androidx.compose.foundation.drawBorder
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Stack
@@ -49,17 +39,27 @@
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.preferredWidth
+import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Tab
import androidx.compose.material.TabRow
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.emptyContent
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.dp
@Sampled
@Composable
fun TextTabs() {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf("TAB 1", "TAB 2", "TAB 3 WITH LOTS OF TEXT")
Column {
TabRow(items = titles, selectedIndex = state) { index, text ->
@@ -75,7 +75,7 @@
@Composable
fun IconTabs() {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val icons = listOf(Icons.Filled.Favorite, Icons.Filled.Favorite, Icons.Filled.Favorite)
Column {
TabRow(items = icons, selectedIndex = state) { index, icon ->
@@ -91,7 +91,7 @@
@Composable
fun TextAndIconTabs() {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titlesAndIcons = listOf(
"TAB 1" to Icons.Filled.Favorite,
"TAB 2" to Icons.Filled.Favorite,
@@ -116,7 +116,7 @@
@Composable
fun ScrollingTextTabs() {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf(
"TAB 1",
"TAB 2",
@@ -144,7 +144,7 @@
@Sampled
@Composable
fun FancyTabs() {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf("TAB 1", "TAB 2", "TAB 3")
Column {
TabRow(items = titles, selectedIndex = state) { index, title ->
@@ -161,7 +161,7 @@
@Sampled
@Composable
fun FancyIndicatorTabs() {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf("TAB 1", "TAB 2", "TAB 3")
// Reuse the default transition, and provide our custom indicator as its child
@@ -190,7 +190,7 @@
@Sampled
@Composable
fun FancyIndicatorContainerTabs() {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf("TAB 1", "TAB 2", "TAB 3")
val indicatorContainer = @Composable { tabPositions: List<TabRow.TabPosition> ->
@@ -215,7 +215,7 @@
@Composable
fun ScrollingFancyIndicatorContainerTabs() {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf(
"TAB 1",
"TAB 2",
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
index 40c5950..8e1c954 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/ButtonTest.kt
@@ -20,30 +20,10 @@
package androidx.compose.material
import android.os.Build
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Providers
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.test.filters.FlakyTest
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
-import androidx.compose.ui.layout.LayoutCoordinates
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.layout.boundsInRoot
-import androidx.compose.ui.onChildPositioned
-import androidx.compose.ui.onPositioned
-import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.platform.testTag
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.contentColor
import androidx.compose.foundation.currentTextStyle
-import androidx.compose.foundation.shape.CutCornerShape
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.RectangleShape
-import androidx.compose.ui.graphics.compositeOver
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.InnerPadding
import androidx.compose.foundation.layout.RowScope
@@ -57,6 +37,34 @@
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.widthIn
+import androidx.compose.foundation.shape.CutCornerShape
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Providers
+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.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.compositeOver
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.boundsInRoot
+import androidx.compose.ui.onChildPositioned
+import androidx.compose.ui.onPositioned
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.PxBounds
+import androidx.compose.ui.unit.center
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.height
+import androidx.compose.ui.unit.sp
+import androidx.compose.ui.unit.width
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
import androidx.ui.test.assertHasClickAction
import androidx.ui.test.assertHasNoClickAction
import androidx.ui.test.assertHeightIsAtLeast
@@ -67,19 +75,12 @@
import androidx.ui.test.assertWidthIsEqualTo
import androidx.ui.test.captureToBitmap
import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
+import androidx.ui.test.hasClickAction
import androidx.ui.test.onNode
import androidx.ui.test.onNodeWithTag
import androidx.ui.test.onNodeWithText
-import androidx.ui.test.hasClickAction
+import androidx.ui.test.performClick
import androidx.ui.test.runOnIdle
-import androidx.compose.ui.unit.Dp
-import androidx.compose.ui.unit.PxBounds
-import androidx.compose.ui.unit.center
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.unit.height
-import androidx.compose.ui.unit.sp
-import androidx.compose.ui.unit.width
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
import org.junit.Test
@@ -152,7 +153,7 @@
val tag = "myButton"
composeTestRule.setMaterialContent {
- var enabled by state { true }
+ var enabled by remember { mutableStateOf(true) }
val onClick = { enabled = false }
Stack {
Button(modifier = Modifier.testTag(tag), onClick = onClick, enabled = enabled) {
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
index 20c0071..50b314a 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxScreenshotTest.kt
@@ -16,26 +16,27 @@
package androidx.compose.material
import android.os.Build
-import androidx.compose.runtime.state
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.foundation.selection.ToggleableState
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
import androidx.test.filters.MediumTest
import androidx.test.filters.SdkSuppress
import androidx.test.screenshot.AndroidXScreenshotTestRule
import androidx.test.screenshot.assertAgainstGolden
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.selection.ToggleableState
-import androidx.compose.foundation.layout.wrapContentSize
import androidx.ui.test.captureToBitmap
import androidx.ui.test.center
import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.performGesture
+import androidx.ui.test.down
+import androidx.ui.test.isToggleable
import androidx.ui.test.onNode
import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.isToggleable
-import androidx.ui.test.down
+import androidx.ui.test.performClick
+import androidx.ui.test.performGesture
import androidx.ui.test.waitForIdle
import org.junit.Rule
import org.junit.Test
@@ -142,7 +143,7 @@
@Test
fun checkBoxTest_unchecked_animateToChecked() {
composeTestRule.setMaterialContent {
- val isChecked = state { false }
+ val isChecked = remember { mutableStateOf(false) }
Box(wrap.testTag(wrapperTestTag)) {
Checkbox(
modifier = wrap,
@@ -167,7 +168,7 @@
@Test
fun checkBoxTest_checked_animateToUnchecked() {
composeTestRule.setMaterialContent {
- val isChecked = state { true }
+ val isChecked = remember { mutableStateOf(true) }
Box(wrap.testTag(wrapperTestTag)) {
Checkbox(
modifier = wrap,
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxUiTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxUiTest.kt
index a1a2611..316ebb90 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxUiTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/CheckboxUiTest.kt
@@ -15,25 +15,26 @@
*/
package androidx.compose.material
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
import androidx.compose.foundation.Strings
+import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.selection.ToggleableState
import androidx.compose.foundation.selection.ToggleableState.Indeterminate
import androidx.compose.foundation.selection.ToggleableState.Off
import androidx.compose.foundation.selection.ToggleableState.On
-import androidx.compose.foundation.layout.Column
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
import androidx.ui.test.assertHasNoClickAction
import androidx.ui.test.assertIsEnabled
import androidx.ui.test.assertIsOff
import androidx.ui.test.assertIsOn
import androidx.ui.test.assertValueEquals
import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
import androidx.ui.test.onNodeWithTag
-import androidx.compose.ui.unit.dp
+import androidx.ui.test.performClick
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -71,7 +72,7 @@
@Test
fun checkBoxTest_toggle() {
composeTestRule.setMaterialContent {
- val (checked, onCheckedChange) = state { false }
+ val (checked, onCheckedChange) = remember { mutableStateOf(false) }
Checkbox(checked, onCheckedChange, modifier = Modifier.testTag(defaultTag))
}
@@ -84,7 +85,7 @@
@Test
fun checkBoxTest_toggle_twice() {
composeTestRule.setMaterialContent {
- val (checked, onCheckedChange) = state { false }
+ val (checked, onCheckedChange) = remember { mutableStateOf(false) }
Checkbox(checked, onCheckedChange, modifier = Modifier.testTag(defaultTag))
}
@@ -100,7 +101,7 @@
fun checkBoxTest_untoggleable_whenNoLambda() {
composeTestRule.setMaterialContent {
- val (checked, _) = state { false }
+ val (checked, _) = remember { mutableStateOf(false) }
Checkbox(checked, {}, enabled = false, modifier = Modifier.testTag(defaultTag))
}
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
index cd03580..05d9abf 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/RadioButtonScreenshotTest.kt
@@ -17,25 +17,26 @@
package androidx.compose.material
import android.os.Build
-import androidx.compose.runtime.state
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
import androidx.test.filters.MediumTest
import androidx.test.filters.SdkSuppress
import androidx.test.screenshot.AndroidXScreenshotTestRule
import androidx.test.screenshot.assertAgainstGolden
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.layout.wrapContentSize
import androidx.ui.test.captureToBitmap
import androidx.ui.test.center
import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.performGesture
+import androidx.ui.test.down
+import androidx.ui.test.isInMutuallyExclusiveGroup
import androidx.ui.test.onNode
import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.isInMutuallyExclusiveGroup
-import androidx.ui.test.down
+import androidx.ui.test.performClick
+import androidx.ui.test.performGesture
import androidx.ui.test.waitForIdle
import org.junit.Rule
import org.junit.Test
@@ -115,7 +116,7 @@
@Test
fun radioButton_notSelected_animateToSelected() {
composeTestRule.setMaterialContent {
- val isSelected = state { false }
+ val isSelected = remember { mutableStateOf(false) }
Box(wrap.testTag(wrapperTestTag)) {
RadioButton(
selected = isSelected.value,
@@ -139,7 +140,7 @@
@Test
fun radioButton_selected_animateToNotSelected() {
composeTestRule.setMaterialContent {
- val isSelected = state { true }
+ val isSelected = remember { mutableStateOf(true) }
Box(wrap.testTag(wrapperTestTag)) {
RadioButton(
selected = isSelected.value,
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
index eec7677..90a6eda 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchScreenshotTest.kt
@@ -17,29 +17,30 @@
package androidx.compose.material
import android.os.Build
-import androidx.compose.runtime.state
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LayoutDirectionAmbient
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.unit.LayoutDirection
import androidx.test.filters.MediumTest
import androidx.test.filters.SdkSuppress
import androidx.test.screenshot.AndroidXScreenshotTestRule
import androidx.test.screenshot.assertAgainstGolden
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
-import androidx.compose.foundation.Box
-import androidx.compose.ui.graphics.Color
-import androidx.compose.foundation.layout.wrapContentSize
-import androidx.compose.runtime.Providers
-import androidx.compose.ui.platform.LayoutDirectionAmbient
-import androidx.compose.ui.unit.LayoutDirection
import androidx.ui.test.captureToBitmap
import androidx.ui.test.center
import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.performGesture
+import androidx.ui.test.down
+import androidx.ui.test.isToggleable
import androidx.ui.test.onNode
import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.isToggleable
-import androidx.ui.test.down
+import androidx.ui.test.performClick
+import androidx.ui.test.performGesture
import androidx.ui.test.waitForIdle
import org.junit.Rule
import org.junit.Test
@@ -156,7 +157,7 @@
@Test
fun switchTest_unchecked_animateToChecked() {
composeTestRule.setMaterialContent {
- val isChecked = state { false }
+ val isChecked = remember { mutableStateOf(false) }
Box(wrapperModifier) {
Switch(
checked = isChecked.value,
@@ -180,7 +181,7 @@
@Test
fun switchTest_checked_animateToUnchecked() {
composeTestRule.setMaterialContent {
- val isChecked = state { true }
+ val isChecked = remember { mutableStateOf(true) }
Box(wrapperModifier) {
Switch(
checked = isChecked.value,
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt
index 6b0dff7..2eaf1a3 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/SwitchTest.kt
@@ -16,17 +16,18 @@
package androidx.compose.material
-import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
import androidx.compose.foundation.Strings
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Stack
import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LayoutDirectionAmbient
+import androidx.compose.ui.platform.testTag
import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
import androidx.ui.test.assertHasNoClickAction
import androidx.ui.test.assertHeightIsEqualTo
import androidx.ui.test.assertIsEnabled
@@ -35,13 +36,12 @@
import androidx.ui.test.assertValueEquals
import androidx.ui.test.assertWidthIsEqualTo
import androidx.ui.test.createComposeRule
+import androidx.ui.test.onNodeWithTag
import androidx.ui.test.performClick
import androidx.ui.test.performGesture
-import androidx.ui.test.onNodeWithTag
import androidx.ui.test.runOnIdle
import androidx.ui.test.swipeLeft
import androidx.ui.test.swipeRight
-import androidx.compose.ui.unit.dp
import com.google.common.truth.Truth
import org.junit.Rule
import org.junit.Test
@@ -83,7 +83,7 @@
@Test
fun switch_toggle() {
composeTestRule.setMaterialContent {
- val (checked, onChecked) = state { false }
+ val (checked, onChecked) = remember { mutableStateOf(false) }
// Stack is needed because otherwise the control will be expanded to fill its parent
Stack {
@@ -103,7 +103,7 @@
@Test
fun switch_toggleTwice() {
composeTestRule.setMaterialContent {
- val (checked, onChecked) = state { false }
+ val (checked, onChecked) = remember { mutableStateOf(false) }
// Stack is needed because otherwise the control will be expanded to fill its parent
Stack {
@@ -125,7 +125,7 @@
@Test
fun switch_uncheckableWithNoLambda() {
composeTestRule.setMaterialContent {
- val (checked, _) = state { false }
+ val (checked, _) = remember { mutableStateOf(false) }
Switch(
modifier = Modifier.testTag(defaultSwitchTag),
checked = checked,
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/TabTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/TabTest.kt
index d09a08f..8054fa2 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/TabTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/TabTest.kt
@@ -15,39 +15,40 @@
*/
package androidx.compose.material
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.test.filters.LargeTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
import androidx.compose.foundation.Box
import androidx.compose.foundation.Icon
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Favorite
import androidx.compose.material.samples.ScrollingTextTabs
import androidx.compose.material.samples.TextTabs
-import androidx.ui.test.assertCountEquals
-import androidx.ui.test.assertHeightIsEqualTo
-import androidx.ui.test.assertIsEqualTo
-import androidx.ui.test.assertIsSelected
-import androidx.ui.test.assertIsNotSelected
-import androidx.ui.test.assertPositionInRootIsEqualTo
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.onAllNodes
-import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.getUnclippedBoundsInRoot
-import androidx.ui.test.isInMutuallyExclusiveGroup
+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.Color
+import androidx.compose.ui.platform.testTag
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.height
import androidx.compose.ui.unit.width
+import androidx.test.filters.LargeTest
+import androidx.ui.test.assertCountEquals
+import androidx.ui.test.assertHeightIsEqualTo
+import androidx.ui.test.assertIsEqualTo
+import androidx.ui.test.assertIsNotSelected
+import androidx.ui.test.assertIsSelected
+import androidx.ui.test.assertPositionInRootIsEqualTo
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.getUnclippedBoundsInRoot
+import androidx.ui.test.isInMutuallyExclusiveGroup
+import androidx.ui.test.onAllNodes
+import androidx.ui.test.onNodeWithTag
+import androidx.ui.test.performClick
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -104,7 +105,7 @@
val indicatorHeight = 1.dp
composeTestRule.setMaterialContent {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf("TAB 1", "TAB 2")
val indicatorContainer = @Composable { tabPositions: List<TabRow.TabPosition> ->
@@ -157,7 +158,7 @@
@Test
fun singleLineTab_textBaseline() {
composeTestRule.setMaterialContent {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf("TAB")
Box {
@@ -193,7 +194,7 @@
@Test
fun singleLineTab_withIcon_textBaseline() {
composeTestRule.setMaterialContent {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf("TAB")
Box {
@@ -230,7 +231,7 @@
@Test
fun twoLineTab_textBaseline() {
composeTestRule.setMaterialContent {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf("Two line \n text")
Box {
@@ -271,7 +272,7 @@
val minimumTabWidth = 90.dp
composeTestRule.setMaterialContent {
- var state by state { 0 }
+ var state by remember { mutableStateOf(0) }
val titles = listOf("TAB 1", "TAB 2")
val indicatorContainer = @Composable { tabPositions: List<TabRow.TabPosition> ->
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
index f18e6e8..11d008e 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/OutlinedTextFieldTest.kt
@@ -17,27 +17,11 @@
package androidx.compose.material.textfield
import android.os.Build
-import androidx.compose.runtime.Providers
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.Ref
-import androidx.compose.ui.onPositioned
-import androidx.compose.ui.platform.testTag
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
import androidx.compose.foundation.contentColor
import androidx.compose.foundation.currentTextStyle
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.RectangleShape
-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.TextFieldValue
-import androidx.compose.ui.text.input.TextInputService
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.preferredSize
import androidx.compose.foundation.layout.preferredWidth
@@ -45,21 +29,38 @@
import androidx.compose.material.OutlinedTextField
import androidx.compose.material.runOnIdleWithDensity
import androidx.compose.material.setMaterialContent
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.node.Ref
+import androidx.compose.ui.onPositioned
import androidx.compose.ui.platform.TextInputServiceAmbient
-import androidx.ui.test.assertShape
-import androidx.ui.test.captureToBitmap
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.performGesture
-import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.runOnIdle
-import androidx.ui.test.click
-import androidx.ui.test.performImeAction
-import androidx.ui.test.waitForIdle
+import androidx.compose.ui.platform.testTag
import androidx.compose.ui.text.SoftwareKeyboardController
+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.TextFieldValue
+import androidx.compose.ui.text.input.TextInputService
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import androidx.ui.test.assertShape
+import androidx.ui.test.captureToBitmap
+import androidx.ui.test.click
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.onNodeWithTag
+import androidx.ui.test.performClick
+import androidx.ui.test.performGesture
+import androidx.ui.test.performImeAction
+import androidx.ui.test.runOnIdle
+import androidx.ui.test.waitForIdle
import com.google.common.truth.Truth.assertThat
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.atLeastOnce
@@ -553,7 +554,7 @@
Providers(
TextInputServiceAmbient provides textInputService
) {
- var text = state { TextFieldValue("") }
+ var text = remember { mutableStateOf(TextFieldValue("")) }
OutlinedTextField(
modifier = Modifier.testTag(TextfieldTag),
value = text.value,
diff --git a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
index 44f5d5d..79031e0 100644
--- a/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
+++ b/ui/ui-material/src/androidAndroidTest/kotlin/androidx/compose/material/textfield/TextFieldTest.kt
@@ -17,56 +17,57 @@
package androidx.compose.material.textfield
import android.os.Build
-import androidx.compose.runtime.Providers
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.test.filters.SdkSuppress
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.node.Ref
-import androidx.compose.ui.onPositioned
-import androidx.compose.ui.platform.testTag
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
import androidx.compose.foundation.contentColor
import androidx.compose.foundation.currentTextStyle
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.RectangleShape
-import androidx.compose.ui.graphics.compositeOver
-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.TextFieldValue
-import androidx.compose.ui.text.input.TextInputService
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Stack
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.preferredHeight
import androidx.compose.foundation.layout.preferredSize
-import androidx.compose.material.TextField
+import androidx.compose.foundation.text.FirstBaseline
import androidx.compose.material.MaterialTheme
+import androidx.compose.material.TextField
import androidx.compose.material.runOnIdleWithDensity
import androidx.compose.material.setMaterialContent
import androidx.compose.material.setMaterialContentForSizeAssertions
-import androidx.ui.test.assertHeightIsEqualTo
-import androidx.ui.test.assertShape
-import androidx.ui.test.captureToBitmap
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.performClick
-import androidx.ui.test.performGesture
-import androidx.ui.test.onNodeWithTag
-import androidx.ui.test.runOnIdle
-import androidx.ui.test.click
-import androidx.ui.test.performImeAction
-import androidx.ui.test.waitForIdle
-import androidx.compose.foundation.text.FirstBaseline
+import androidx.compose.runtime.Providers
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.compositeOver
import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.node.Ref
+import androidx.compose.ui.onPositioned
import androidx.compose.ui.platform.TextInputServiceAmbient
+import androidx.compose.ui.platform.testTag
import androidx.compose.ui.text.SoftwareKeyboardController
+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.TextFieldValue
+import androidx.compose.ui.text.input.TextInputService
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import androidx.ui.test.assertHeightIsEqualTo
+import androidx.ui.test.assertShape
+import androidx.ui.test.captureToBitmap
+import androidx.ui.test.click
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.onNodeWithTag
+import androidx.ui.test.performClick
+import androidx.ui.test.performGesture
+import androidx.ui.test.performImeAction
+import androidx.ui.test.runOnIdle
+import androidx.ui.test.waitForIdle
import com.google.common.truth.Truth.assertThat
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.atLeastOnce
@@ -637,7 +638,7 @@
Providers(
TextInputServiceAmbient provides textInputService
) {
- val text = state { TextFieldValue("") }
+ val text = remember { mutableStateOf(TextFieldValue("")) }
TextField(
modifier = Modifier.testTag(TextfieldTag),
value = text.value,
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Menu.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
index 508e849..5aa22fe 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
@@ -20,16 +20,7 @@
import androidx.compose.animation.core.LinearOutSlowInEasing
import androidx.compose.animation.core.transitionDefinition
import androidx.compose.animation.core.tween
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.animation.transition
-import androidx.compose.ui.platform.DensityAmbient
-import androidx.compose.ui.unit.LayoutDirection
-import androidx.compose.ui.Modifier
import androidx.compose.foundation.Box
import androidx.compose.foundation.ContentGravity
import androidx.compose.foundation.ProvideTextStyle
@@ -43,18 +34,27 @@
import androidx.compose.foundation.layout.preferredSizeIn
import androidx.compose.foundation.layout.preferredWidth
import androidx.compose.material.ripple.RippleIndication
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
import androidx.compose.ui.DrawLayerModifier
+import androidx.compose.ui.Modifier
import androidx.compose.ui.TransformOrigin
-import androidx.compose.ui.window.Popup
-import androidx.compose.ui.window.PopupPositionProvider
+import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntBounds
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.Position
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.height
import androidx.compose.ui.unit.width
+import androidx.compose.ui.window.Popup
+import androidx.compose.ui.window.PopupPositionProvider
import kotlin.math.max
import kotlin.math.min
@@ -94,14 +94,14 @@
dropdownModifier: Modifier = Modifier,
dropdownContent: @Composable ColumnScope.() -> Unit
) {
- var visibleMenu by state { expanded }
+ var visibleMenu by remember { mutableStateOf(expanded) }
if (expanded) visibleMenu = true
Box(toggleModifier) {
toggle()
if (visibleMenu) {
- var transformOrigin by state { TransformOrigin.Center }
+ var transformOrigin by remember { mutableStateOf(TransformOrigin.Center) }
val density = DensityAmbient.current
val popupPositionProvider = DropdownMenuPositionProvider(
dropdownOffset,
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
index dce7a75..f315555 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/OutlinedTextField.kt
@@ -19,44 +19,43 @@
package androidx.compose.material
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.Text
+import androidx.compose.foundation.currentTextStyle
+import androidx.compose.foundation.layout.padding
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.ui.Alignment
-import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.FocusModifier
import androidx.compose.ui.Layout
-import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.Modifier
import androidx.compose.ui.Placeable
import androidx.compose.ui.drawBehind
-import androidx.compose.ui.layout.id
-import androidx.compose.ui.layout.layoutId
-import androidx.compose.ui.unit.offset
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.Text
-import androidx.compose.foundation.currentTextStyle
+import androidx.compose.ui.focus.FocusState
+import androidx.compose.ui.focusState
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.drawscope.Stroke
-import androidx.compose.ui.text.input.ImeAction
-import androidx.compose.ui.text.input.KeyboardType
-import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.input.VisualTransformation
-import androidx.compose.foundation.layout.padding
-import androidx.compose.ui.FocusModifier
-import androidx.compose.ui.focus.FocusState
-import androidx.compose.ui.focusState
+import androidx.compose.ui.layout.id
+import androidx.compose.ui.layout.layoutId
import androidx.compose.ui.text.InternalTextApi
import androidx.compose.ui.text.SoftwareKeyboardController
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.constrain
+import androidx.compose.ui.text.input.ImeAction
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.text.input.VisualTransformation
+import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.offset
import kotlin.math.max
import kotlin.math.roundToInt
@@ -136,7 +135,7 @@
inactiveColor: Color = MaterialTheme.colors.onSurface,
errorColor: Color = MaterialTheme.colors.error
) {
- var textFieldValue by state { TextFieldValue() }
+ var textFieldValue by remember { mutableStateOf(TextFieldValue()) }
if (textFieldValue.text != value) {
@OptIn(InternalTextApi::class)
textFieldValue = TextFieldValue(
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
index f09b436..256f408 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/Swipeable.kt
@@ -40,7 +40,6 @@
import androidx.compose.runtime.onCommit
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
@@ -254,7 +253,7 @@
onStateChange: (T) -> Unit,
animationSpec: AnimationSpec<Float> = SpringSpec()
): SwipeableState<T> {
- val forceAnimationCheck = state { false }
+ val forceAnimationCheck = remember { mutableStateOf(false) }
val clock = AnimationClockAmbient.current.asDisposableClock()
val swipeableState = remember(clock) {
SwipeableState(state, clock, animationSpec = animationSpec)
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextField.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
index c86e2f4..78fc4b4 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextField.kt
@@ -16,41 +16,42 @@
package androidx.compose.material
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.getValue
-import androidx.compose.runtime.setValue
-import androidx.compose.runtime.state
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.Placeable
-import androidx.compose.ui.layout.id
-import androidx.compose.ui.layout.layoutId
-import androidx.compose.ui.unit.offset
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
import androidx.compose.foundation.currentTextStyle
+import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.ZeroCornerSize
+import androidx.compose.foundation.text.LastBaseline
+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.Alignment
+import androidx.compose.ui.AlignmentLine
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.Placeable
+import androidx.compose.ui.drawBehind
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.layout.id
+import androidx.compose.ui.layout.layoutId
+import androidx.compose.ui.text.InternalTextApi
+import androidx.compose.ui.text.SoftwareKeyboardController
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.constrain
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation
-import androidx.compose.foundation.layout.padding
-import androidx.compose.ui.text.InternalTextApi
-import androidx.compose.foundation.text.LastBaseline
-import androidx.compose.ui.AlignmentLine
-import androidx.compose.ui.drawBehind
-import androidx.compose.ui.text.SoftwareKeyboardController
-import androidx.compose.ui.text.TextStyle
-import androidx.compose.ui.text.constrain
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.offset
import kotlin.math.max
import kotlin.math.roundToInt
@@ -162,7 +163,7 @@
shape: Shape =
MaterialTheme.shapes.small.copy(bottomLeft = ZeroCornerSize, bottomRight = ZeroCornerSize)
) {
- var textFieldValue by state { TextFieldValue() }
+ var textFieldValue by remember { mutableStateOf(TextFieldValue()) }
if (textFieldValue.text != value) {
@OptIn(InternalTextApi::class)
textFieldValue = TextFieldValue(
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
index 7513f6d..7d203b5 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/TextFieldImpl.kt
@@ -19,59 +19,58 @@
package androidx.compose.material
+import androidx.compose.animation.ColorPropKey
+import androidx.compose.animation.DpPropKey
import androidx.compose.animation.core.FloatPropKey
import androidx.compose.animation.core.TransitionSpec
import androidx.compose.animation.core.transitionDefinition
import androidx.compose.animation.core.tween
+import androidx.compose.animation.transition
+import androidx.compose.foundation.BaseTextField
+import androidx.compose.foundation.ContentColorAmbient
+import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.ProvideTextStyle
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.gestures.rememberScrollableController
+import androidx.compose.foundation.gestures.scrollable
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.preferredSizeIn
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Providers
import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
+import androidx.compose.runtime.savedinstancestate.Saver
+import androidx.compose.runtime.savedinstancestate.rememberSavedInstanceState
import androidx.compose.runtime.setValue
-import androidx.compose.runtime.stateFor
import androidx.compose.runtime.structuralEqualityPolicy
-import androidx.compose.animation.ColorPropKey
-import androidx.compose.animation.DpPropKey
-import androidx.compose.animation.transition
-import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.FocusModifier
import androidx.compose.ui.Layout
import androidx.compose.ui.LayoutModifier
+import androidx.compose.ui.Measurable
import androidx.compose.ui.MeasureScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.Placeable
-import androidx.compose.ui.node.Ref
import androidx.compose.ui.draw.clipToBounds
-import androidx.compose.ui.unit.constrainWidth
+import androidx.compose.ui.focus.FocusState
+import androidx.compose.ui.focusState
import androidx.compose.ui.gesture.scrollorientationlocking.Orientation
-import androidx.compose.ui.unit.offset
-import androidx.compose.foundation.ContentColorAmbient
-import androidx.compose.foundation.ProvideTextStyle
-import androidx.compose.foundation.BaseTextField
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.clickable
-import androidx.compose.foundation.gestures.rememberScrollableController
-import androidx.compose.foundation.gestures.scrollable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.node.Ref
+import androidx.compose.ui.text.SoftwareKeyboardController
+import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.text.input.VisualTransformation
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.preferredSizeIn
-import androidx.compose.runtime.savedinstancestate.Saver
-import androidx.compose.runtime.savedinstancestate.rememberSavedInstanceState
-import androidx.compose.ui.FocusModifier
-import androidx.compose.ui.Measurable
-import androidx.compose.ui.focus.FocusState
-import androidx.compose.ui.focusState
-import androidx.compose.ui.text.SoftwareKeyboardController
-import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.lerp
+import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.constrainWidth
import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.offset
import androidx.compose.ui.util.annotation.VisibleForTesting
import kotlin.math.min
import kotlin.math.roundToInt
@@ -112,12 +111,14 @@
val focusModifier = FocusModifier()
val keyboardController: Ref<SoftwareKeyboardController> = remember { Ref() }
- val inputState = stateFor(value.text, focusModifier.focusState) {
- when {
- focusModifier.focusState == FocusState.Focused -> InputPhase.Focused
- value.text.isEmpty() -> InputPhase.UnfocusedEmpty
- else -> InputPhase.UnfocusedNotEmpty
- }
+ val inputState = remember(value.text, focusModifier.focusState) {
+ mutableStateOf(
+ when {
+ focusModifier.focusState == FocusState.Focused -> InputPhase.Focused
+ value.text.isEmpty() -> InputPhase.UnfocusedEmpty
+ else -> InputPhase.UnfocusedNotEmpty
+ }
+ )
}
val decoratedPlaceholder: @Composable (() -> Unit)? =
diff --git a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/ripple/RippleIndication.kt b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/ripple/RippleIndication.kt
index cb08645..7738a1c 100644
--- a/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/ripple/RippleIndication.kt
+++ b/ui/ui-material/src/commonMain/kotlin/androidx/compose/material/ripple/RippleIndication.kt
@@ -16,33 +16,33 @@
package androidx.compose.material.ripple
+import androidx.compose.animation.AnimatedFloatModel
+import androidx.compose.animation.asDisposableClock
import androidx.compose.animation.core.AnimationClockObservable
import androidx.compose.animation.core.AnimationSpec
import androidx.compose.animation.core.LinearEasing
import androidx.compose.animation.core.TweenSpec
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Stable
-import androidx.compose.runtime.State
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.mutableStateListOf
-import androidx.compose.runtime.state
-import androidx.compose.runtime.structuralEqualityPolicy
-import androidx.compose.animation.AnimatedFloatModel
-import androidx.compose.animation.asDisposableClock
-import androidx.compose.ui.platform.AnimationClockAmbient
-import androidx.compose.ui.ContentDrawScope
import androidx.compose.foundation.Indication
import androidx.compose.foundation.IndicationInstance
import androidx.compose.foundation.Interaction
import androidx.compose.foundation.InteractionState
+import androidx.compose.material.ExperimentalMaterialApi
+import androidx.compose.material.MaterialTheme
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateListOf
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.structuralEqualityPolicy
+import androidx.compose.ui.ContentDrawScope
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.graphics.drawscope.clipRect
import androidx.compose.ui.graphics.useOrElse
-import androidx.compose.material.ExperimentalMaterialApi
-import androidx.compose.material.MaterialTheme
+import androidx.compose.ui.platform.AnimationClockAmbient
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.util.nativeClass
@@ -80,7 +80,7 @@
val theme = RippleThemeAmbient.current
val clock = AnimationClockAmbient.current.asDisposableClock()
val resolvedColor = color.useOrElse { theme.defaultColor() }
- val colorState = state(structuralEqualityPolicy()) { resolvedColor }
+ val colorState = remember { mutableStateOf(resolvedColor, structuralEqualityPolicy()) }
colorState.value = resolvedColor
val interactionOpacity = theme.rippleOpacity()
return remember(bounded, radius, theme, clock) {
diff --git a/ui/ui-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt b/ui/ui-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt
index d3a0be1..bfd5c19 100644
--- a/ui/ui-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt
+++ b/ui/ui-rxjava2/src/main/java/androidx/compose/runtime/rxjava2/RxJava2Adapter.kt
@@ -18,8 +18,9 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
+import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.onPreCommit
-import androidx.compose.runtime.state
+import androidx.compose.runtime.remember
import io.reactivex.Completable
import io.reactivex.Flowable
import io.reactivex.Maybe
@@ -210,7 +211,7 @@
initial: T,
crossinline subscribe: S.((T) -> Unit) -> Disposable
): State<T> {
- val state = state { initial }
+ val state = remember { mutableStateOf(initial) }
onPreCommit(this) {
val disposable = subscribe {
state.value = it
diff --git a/ui/ui-saved-instance-state/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/SavedInstanceState.kt b/ui/ui-saved-instance-state/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/SavedInstanceState.kt
index 8664eed..0c65716 100644
--- a/ui/ui-saved-instance-state/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/SavedInstanceState.kt
+++ b/ui/ui-saved-instance-state/src/commonMain/kotlin/androidx/compose/runtime/savedinstancestate/SavedInstanceState.kt
@@ -20,15 +20,14 @@
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.SnapshotMutationPolicy
import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.state
import androidx.compose.runtime.structuralEqualityPolicy
/**
* Used to introduce a state value of type [T] into a composition.
*
- * It behaves similarly to [state], but the stored value will survive the activity or process
- * recreation using the saved instance state mechanism (for example it happens when the screen is
- * rotated in the Android application).
+ * It behaves similarly to `remember { mutableStateOf(...) }`, but the stored value will survive
+ * the activity or process recreation using the saved instance state mechanism (for example it
+ * happens when the screen is rotated in the Android application).
*
* @sample androidx.compose.runtime.savedinstancestate.samples.SavedInstanceStateSample
*
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AndroidComposeTestCaseRunnerTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AndroidComposeTestCaseRunnerTest.kt
index 06eaf46..ac8b7dd 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AndroidComposeTestCaseRunnerTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AndroidComposeTestCaseRunnerTest.kt
@@ -16,13 +16,13 @@
package androidx.ui.test
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.onPreCommit
-import androidx.compose.runtime.state
+import androidx.compose.runtime.remember
import androidx.test.filters.SmallTest
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.Text
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -69,7 +69,7 @@
// @Test //- TODO: Does not work, performs only 1 frame until stable
fun foreverRecomposing_viaState_shouldFail() {
composeTestRule.forGivenContent {
- val state = state { 0 }
+ val state = remember { mutableStateOf(0) }
Text("Hello ${state.value}")
state.value++
}.performTestWithEventsControl {
@@ -83,7 +83,7 @@
// @Test //- TODO: Does not work, performs only 1 frame until stable
fun foreverRecomposing_viaStatePreCommit_shouldFail() {
composeTestRule.forGivenContent {
- val state = state { 0 }
+ val state = remember { mutableStateOf(0) }
Text("Hello ${state.value}")
onPreCommit {
state.value++
@@ -119,7 +119,7 @@
@Test
fun recomposeOnce() {
composeTestRule.forGivenContent {
- val state = state { 0 }
+ val state = remember { mutableStateOf(0) }
if (state.value < 1) {
state.value++
}
@@ -132,7 +132,7 @@
// @Test //- TODO: Does not work, performs only 1 frame until stable
fun recomposeTwice() {
composeTestRule.forGivenContent {
- val state = state { 0 }
+ val state = remember { mutableStateOf(0) }
if (state.value < 2) {
state.value++
}
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AssertExistsTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AssertExistsTest.kt
index 7ab7417..7dcc1bc 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AssertExistsTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/AssertExistsTest.kt
@@ -16,16 +16,17 @@
package androidx.ui.test
-import androidx.compose.runtime.state
-import androidx.test.filters.FlakyTest
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
import androidx.compose.foundation.Text
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Button
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
+import androidx.test.filters.FlakyTest
+import androidx.test.filters.MediumTest
import androidx.ui.test.util.expectAssertionError
import org.junit.Rule
import org.junit.Test
@@ -45,7 +46,7 @@
composeTestRule.setContent {
MaterialTheme {
Surface {
- val (showText, toggle) = state { true }
+ val (showText, toggle) = remember { mutableStateOf(true) }
Column {
Button(
modifier = Modifier.testTag("MyButton"),
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/CallSemanticsActionTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/CallSemanticsActionTest.kt
index 0de9fc3..454e800 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/CallSemanticsActionTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/CallSemanticsActionTest.kt
@@ -16,16 +16,17 @@
package androidx.ui.test
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.semantics.semantics
import androidx.compose.foundation.layout.Column
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.AccessibilityAction
import androidx.compose.ui.semantics.SemanticsPropertyKey
import androidx.compose.ui.semantics.SemanticsPropertyReceiver
import androidx.compose.ui.semantics.accessibilityLabel
+import androidx.compose.ui.semantics.semantics
+import androidx.test.filters.MediumTest
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -41,7 +42,7 @@
@Test
fun performSemanticsAction() {
composeTestRule.setContent {
- val state = state { "Nothing" }
+ val state = remember { mutableStateOf("Nothing") }
BoundaryNode {
setString("SetString") { state.value = it; return@setString true }
accessibilityLabel = state.value
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/ErrorMessagesTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/ErrorMessagesTest.kt
index 103891b..f0d786c 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/ErrorMessagesTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/ErrorMessagesTest.kt
@@ -16,18 +16,19 @@
package androidx.ui.test
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
import androidx.compose.foundation.Box
import androidx.compose.foundation.Text
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Column
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
import androidx.compose.ui.semantics.SemanticsActions
+import androidx.test.filters.MediumTest
import androidx.ui.test.util.expectErrorMessage
import androidx.ui.test.util.expectErrorMessageStartsWith
import org.junit.Rule
@@ -315,7 +316,7 @@
@Composable
fun ComposeTextToHideCase() {
MaterialTheme {
- val (showText, toggle) = state { true }
+ val (showText, toggle) = remember { mutableStateOf(true) }
Column {
TestButton(
modifier = Modifier.testTag("MyButton"),
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/FindAllTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/FindAllTest.kt
index ccedfe9..f1873f8 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/FindAllTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/FindAllTest.kt
@@ -16,12 +16,13 @@
package androidx.ui.test
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
import androidx.compose.foundation.layout.Column
import androidx.compose.material.Checkbox
import androidx.compose.material.MaterialTheme
import androidx.compose.material.Surface
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.test.filters.MediumTest
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -58,8 +59,8 @@
@Test
fun findAllTest_twoComponents_toggleBoth() {
composeTestRule.setContent {
- val (checked1, onCheckedChange1) = state { false }
- val (checked2, onCheckedChange2) = state { false }
+ val (checked1, onCheckedChange1) = remember { mutableStateOf(false) }
+ val (checked2, onCheckedChange2) = remember { mutableStateOf(false) }
MaterialTheme {
Surface {
Column {
@@ -110,8 +111,8 @@
composeTestRule.setContent {
MaterialTheme {
Surface {
- val (checked1, onCheckedChange1) = state { false }
- val (checked2, onCheckedChange2) = state { false }
+ val (checked1, onCheckedChange1) = remember { mutableStateOf(false) }
+ val (checked2, onCheckedChange2) = remember { mutableStateOf(false) }
Column {
Checkbox(
@@ -141,7 +142,7 @@
composeTestRule.setContent {
MaterialTheme {
Surface {
- val (checked, onCheckedChange) = state { false }
+ val (checked, onCheckedChange) = remember { mutableStateOf(false) }
Column {
Checkbox(
@@ -188,7 +189,7 @@
composeTestRule.setContent {
MaterialTheme {
Surface {
- val (checked, onCheckedChange) = state { false }
+ val (checked, onCheckedChange) = remember { mutableStateOf(false) }
Column {
Checkbox(
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TextActionsTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TextActionsTest.kt
index 91d1f7d..4adce97 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TextActionsTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TextActionsTest.kt
@@ -16,15 +16,16 @@
package androidx.ui.test
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.test.filters.MediumTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.platform.testTag
import androidx.compose.foundation.BaseTextField
import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.testTag
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
+import androidx.test.filters.MediumTest
import androidx.ui.test.util.BoundaryNode
import androidx.ui.test.util.expectError
import androidx.ui.test.util.expectErrorMessageStartsWith
@@ -50,7 +51,7 @@
onImeActionPerformed: (ImeAction) -> Unit = {},
textCallback: (String) -> Unit = {}
) {
- val state = state { TextFieldValue("") }
+ val state = remember { mutableStateOf(TextFieldValue("")) }
BaseTextField(
modifier = Modifier.testTag(fieldTag),
value = state.value,
diff --git a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TimeOutTest.kt b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TimeOutTest.kt
index f9da6c3..9728dca 100644
--- a/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TimeOutTest.kt
+++ b/ui/ui-test/src/androidAndroidTest/kotlin/androidx/ui/test/TimeOutTest.kt
@@ -17,22 +17,22 @@
package androidx.ui.test
import androidx.activity.ComponentActivity
+import androidx.compose.foundation.Box
+import androidx.compose.foundation.Text
+import androidx.compose.foundation.layout.Stack
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
-import androidx.compose.runtime.state
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.onPositioned
import androidx.test.espresso.AppNotIdleException
import androidx.test.espresso.IdlingPolicies
import androidx.test.espresso.IdlingPolicy
import androidx.test.espresso.IdlingRegistry
import androidx.test.espresso.IdlingResource
import androidx.test.filters.LargeTest
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.onPositioned
-import androidx.compose.foundation.Box
-import androidx.compose.foundation.Text
-import androidx.compose.foundation.layout.Stack
-import androidx.ui.test.android.createAndroidComposeRule
import androidx.ui.test.android.ComposeNotIdleException
+import androidx.ui.test.android.createAndroidComposeRule
import androidx.ui.test.util.expectError
import org.junit.After
import org.junit.Before
@@ -72,7 +72,7 @@
@Composable
fun infiniteCase() {
Stack {
- val infiniteCounter = state { 0 }
+ val infiniteCounter = remember { mutableStateOf(0) }
Box(Modifier.onPositioned {
infiniteCounter.value += 1
}) {
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputField.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputField.kt
index 6b1ad56..1b007a8 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputField.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputField.kt
@@ -16,18 +16,19 @@
package androidx.compose.foundation.text.demos
-import androidx.compose.runtime.Composable
import androidx.compose.foundation.BaseTextField
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.ScrollableColumn
+import androidx.compose.runtime.Composable
import androidx.compose.runtime.key
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.runtime.savedinstancestate.savedInstanceState
-import androidx.compose.runtime.state
+import androidx.compose.ui.text.SoftwareKeyboardController
+import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.SoftwareKeyboardController
-import androidx.compose.ui.text.TextStyle
private val KEYBOARD_TYPES = listOf(
Pair(KeyboardType.Text, "Text"),
@@ -82,7 +83,7 @@
keyboardType: KeyboardType = KeyboardType.Text,
imeAction: ImeAction = ImeAction.Unspecified
) {
- val controller = state<SoftwareKeyboardController?> { null }
+ val controller = remember { mutableStateOf<SoftwareKeyboardController?>(null) }
val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
BaseTextField(
value = state.value,
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputFieldFocusTransition.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputFieldFocusTransition.kt
index 6855793..5b66493 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputFieldFocusTransition.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeInputFieldFocusTransition.kt
@@ -16,17 +16,18 @@
package androidx.compose.foundation.text.demos
-import androidx.compose.runtime.Composable
import androidx.compose.foundation.BaseTextField
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.ScrollableColumn
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.runtime.savedinstancestate.savedInstanceState
-import androidx.compose.runtime.state
import androidx.compose.ui.FocusModifier
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.sp
@Composable
@@ -55,7 +56,7 @@
val state = savedInstanceState(saver = TextFieldValue.Saver) {
TextFieldValue("Focus Transition Test")
}
- val focused = state { false }
+ val focused = remember { mutableStateOf(false) }
val color = if (focused.value) {
Color.Red
} else {
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelection.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelection.kt
index bdac165..b5ce54e 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelection.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelection.kt
@@ -16,24 +16,25 @@
package androidx.compose.foundation.text.demos
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.selection.Selection
-import androidx.compose.ui.selection.SelectionContainer
import androidx.compose.foundation.ScrollableColumn
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.text.intl.LocaleList
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.selection.Selection
+import androidx.compose.ui.selection.SelectionContainer
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.annotatedString
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.text.intl.LocaleList
import androidx.compose.ui.text.withStyle
@Composable
@@ -50,7 +51,7 @@
@Composable
fun TextDemoSelection() {
- val selection = state<Selection?> { null }
+ val selection = remember { mutableStateOf<Selection?>(null) }
val arabicSentence =
"\nكلمة شين في قاموس المعاني الفوري مجال البحث مصطلحات المعجم الوسيط ،اللغة"
SelectionContainer(
@@ -95,7 +96,7 @@
@Composable
fun TextDemoSelectionWithStringInput() {
- val selection = state<Selection?> { null }
+ val selection = remember { mutableStateOf<Selection?>(null) }
SelectionContainer(
selection = selection.value,
onSelectionChange = { selection.value = it }) {
@@ -128,7 +129,7 @@
Color(0xFFFF0000)
)
- val selection = state<Selection?> { null }
+ val selection = remember { mutableStateOf<Selection?>(null) }
SelectionContainer(
selection = selection.value,
onSelectionChange = { selection.value = it }) {
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelectionSample.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelectionSample.kt
index 99b319c..1af05b8 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelectionSample.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeTextSelectionSample.kt
@@ -16,19 +16,20 @@
package androidx.compose.foundation.text.demos
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.selection.Selection
-import androidx.compose.ui.selection.SelectionContainer
import androidx.compose.foundation.Box
import androidx.compose.foundation.ScrollableColumn
import androidx.compose.foundation.Text
-import androidx.compose.ui.graphics.Color
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.preferredSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.selection.Selection
+import androidx.compose.ui.selection.SelectionContainer
import androidx.compose.ui.text.SpanStyle
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.annotatedString
@@ -72,7 +73,7 @@
@Composable
fun TextSelectionSample() {
- val selection = state<Selection?> { null }
+ val selection = remember { mutableStateOf<Selection?>(null) }
ScrollableColumn {
SelectionContainer(
selection = selection.value,
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeVariousInputField.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeVariousInputField.kt
index 335a0c7..84aad37 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeVariousInputField.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/ComposeVariousInputField.kt
@@ -16,22 +16,27 @@
package androidx.compose.foundation.text.demos
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.emptyContent
import androidx.compose.foundation.BaseTextField
-import androidx.compose.runtime.state
-import androidx.compose.ui.unit.Constraints
-import androidx.compose.ui.Layout
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.layout.id
-import androidx.compose.ui.layout.layoutId
import androidx.compose.foundation.Box
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.ScrollableColumn
import androidx.compose.foundation.Text
import androidx.compose.foundation.background
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.emptyContent
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.savedinstancestate.savedInstanceState
+import androidx.compose.ui.Layout
+import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.id
+import androidx.compose.ui.layout.layoutId
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextRange
+import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.input.OffsetMap
@@ -40,12 +45,8 @@
import androidx.compose.ui.text.input.TransformedText
import androidx.compose.ui.text.input.VisualTransformation
import androidx.compose.ui.text.intl.LocaleList
-import androidx.compose.runtime.savedinstancestate.savedInstanceState
-import androidx.compose.ui.text.AnnotatedString
-import androidx.compose.ui.text.TextLayoutResult
-import androidx.compose.ui.text.TextRange
-import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.toUpperCase
+import androidx.compose.ui.unit.Constraints
import kotlin.math.roundToInt
/**
@@ -322,7 +323,7 @@
@OptIn(ExperimentalFoundationApi::class)
private fun CustomCursorTextField(cursor: @Composable () -> Unit) {
val state = savedInstanceState(saver = TextFieldValue.Saver) { TextFieldValue() }
- val layoutResult = state<TextLayoutResult?> { null }
+ val layoutResult = remember { mutableStateOf<TextLayoutResult?>(null) }
Layout({
BaseTextField(
modifier = Modifier.layoutId("inputField"),
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/InteractiveText.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/InteractiveText.kt
index e3e22d0..6c1d83b 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/InteractiveText.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/InteractiveText.kt
@@ -16,11 +16,12 @@
package androidx.compose.foundation.text.demos
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
import androidx.compose.foundation.ClickableText
import androidx.compose.foundation.ScrollableColumn
import androidx.compose.foundation.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.ui.text.AnnotatedString
@Composable
@@ -30,7 +31,7 @@
@Composable
fun TextOnClick() {
- val clickedOffset = state { -1 }
+ val clickedOffset = remember { mutableStateOf(-1) }
ScrollableColumn {
Text("Clicked Offset: ${clickedOffset.value}")
ClickableText(
diff --git a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/TextFieldWIthScroller.kt b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/TextFieldWIthScroller.kt
index 2fe11ad..3e4e19e 100644
--- a/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/TextFieldWIthScroller.kt
+++ b/ui/ui-text/integration-tests/ui-text-compose-demos/src/main/java/androidx/compose/foundation/text/demos/TextFieldWIthScroller.kt
@@ -16,23 +16,26 @@
package androidx.compose.foundation.text.demos
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.state
-import androidx.compose.ui.Modifier
-import androidx.compose.foundation.ScrollableColumn
-import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.BaseTextField
import androidx.compose.foundation.ExperimentalFoundationApi
+import androidx.compose.foundation.ScrollableColumn
+import androidx.compose.foundation.layout.padding
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.text.input.TextFieldValue
import androidx.compose.ui.unit.dp
@Composable
@OptIn(ExperimentalFoundationApi::class)
fun TextFieldWithScrollerDemo() {
ScrollableColumn {
- val state = state {
- TextFieldValue(
- text = List(100) { "Line: $it" }.joinToString("\n")
+ val state = remember {
+ mutableStateOf(
+ TextFieldValue(
+ text = List(100) { "Line: $it" }.joinToString("\n")
+ )
)
}
BaseTextField(
diff --git a/ui/ui-text/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt b/ui/ui-text/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
index c93a8ef..44b2a8e 100644
--- a/ui/ui-text/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
+++ b/ui/ui-text/src/commonMain/kotlin/androidx/compose/foundation/text/CoreTextField.kt
@@ -19,6 +19,8 @@
package androidx.compose.foundation.text
+import androidx.compose.foundation.text.selection.SelectionHandle
+import androidx.compose.foundation.text.selection.TextFieldSelectionManager
import androidx.compose.runtime.Composable
import androidx.compose.runtime.emptyContent
import androidx.compose.runtime.getValue
@@ -27,41 +29,32 @@
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.runtime.state
+import androidx.compose.ui.FocusModifier
import androidx.compose.ui.Layout
-import androidx.compose.ui.layout.LayoutCoordinates
import androidx.compose.ui.Modifier
-import androidx.compose.ui.onPositioned
+import androidx.compose.ui.drawBehind
+import androidx.compose.ui.focus.FocusState
+import androidx.compose.ui.focusState
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.gesture.DragObserver
import androidx.compose.ui.gesture.LongPressDragObserver
import androidx.compose.ui.gesture.dragGestureFilter
import androidx.compose.ui.gesture.longPressDragGestureFilter
import androidx.compose.ui.gesture.pressIndicatorGestureFilter
-import androidx.compose.ui.selection.SelectionLayout
-import androidx.compose.ui.semantics.semantics
-import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.drawscope.drawCanvas
-import androidx.compose.ui.text.input.EditProcessor
-import androidx.compose.ui.text.input.TextFieldValue
-import androidx.compose.ui.text.input.ImeAction
-import androidx.compose.ui.text.input.KeyboardType
-import androidx.compose.ui.text.input.NO_SESSION
-import androidx.compose.ui.text.input.VisualTransformation
-import androidx.compose.ui.semantics.onClick
-import androidx.compose.foundation.text.selection.SelectionHandle
-import androidx.compose.foundation.text.selection.TextFieldSelectionManager
-import androidx.compose.ui.FocusModifier
-import androidx.compose.ui.drawBehind
-import androidx.compose.ui.focus.FocusState
-import androidx.compose.ui.focusState
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.onPositioned
import androidx.compose.ui.platform.ClipboardManagerAmbient
import androidx.compose.ui.platform.DensityAmbient
import androidx.compose.ui.platform.FontLoaderAmbient
import androidx.compose.ui.platform.HapticFeedBackAmbient
import androidx.compose.ui.platform.TextInputServiceAmbient
import androidx.compose.ui.platform.TextToolbarAmbient
-import kotlin.math.max
+import androidx.compose.ui.selection.SelectionLayout
import androidx.compose.ui.semantics.focused
import androidx.compose.ui.semantics.getTextLayoutResult
+import androidx.compose.ui.semantics.onClick
+import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.semantics.setSelection
import androidx.compose.ui.semantics.setText
import androidx.compose.ui.semantics.text
@@ -74,6 +67,13 @@
import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.constrain
+import androidx.compose.ui.text.input.EditProcessor
+import androidx.compose.ui.text.input.ImeAction
+import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.text.input.NO_SESSION
+import androidx.compose.ui.text.input.TextFieldValue
+import androidx.compose.ui.text.input.VisualTransformation
+import kotlin.math.max
import kotlin.math.roundToInt
@Suppress("DEPRECATION")
@@ -93,7 +93,7 @@
onTextLayout: (TextLayoutResult) -> Unit = {},
onTextInputStarted: (SoftwareKeyboardController) -> Unit = {}
) {
- val fullModel = state { TextFieldValue() }
+ val fullModel = remember { mutableStateOf(TextFieldValue()) }
if (fullModel.value.text != value.text ||
fullModel.value.selection != value.selection ||
fullModel.value.composition != value.composition) {
@@ -196,7 +196,10 @@
// and IME may think it is updated. To fix this inconsistent state, enforce recompose by
// incrementing generation counter when we callback to the developer and reset the state with
// the latest state.
- val generation = state { 0 }
+
+ // BUG: b/162464429 - this can throw, "Expected a group" exceptions if changed to the
+ // suggested equivalent for the deprecated state {} function.
+ val generation = state { 0 } // remember { mutableStateOf(0) }
val Wrapper: @Composable (Int, @Composable () -> Unit) -> Unit = { _, child -> child() }
val onValueChangeWrapper: (TextFieldValue) -> Unit = { onValueChange(it); generation.value++ }
@@ -474,7 +477,7 @@
onBlur: (hasNextClient: Boolean) -> Unit,
focusModifier: FocusModifier
): Modifier {
- val prevState = state { FocusState.NotFocused }
+ val prevState = remember { mutableStateOf(FocusState.NotFocused) }
if (focusModifier.focusState == FocusState.Focused &&
prevState.value == FocusState.NotFocused
) {
@@ -611,7 +614,7 @@
onRelease: (Offset) -> Unit,
longPressDragObserver: LongPressDragObserver
): Modifier {
- val tracker = state { DragEventTracker() }
+ val tracker = remember { DragEventTracker() }
// TODO(shepshapard): PressIndicator doesn't seem to be the right thing to use here. It
// actually may be functionally correct, but might mostly suggest that it should not
// actually be called PressIndicator, but instead something else.
@@ -619,15 +622,15 @@
return this
.pressIndicatorGestureFilter(
onStart = {
- tracker.value.init(it)
+ tracker.init(it)
onPress(it)
}, onStop = {
- onRelease(tracker.value.getPosition())
+ onRelease(tracker.getPosition())
})
.dragGestureFilter(dragObserver = object :
DragObserver {
override fun onDrag(dragDistance: Offset): Offset {
- tracker.value.onDrag(dragDistance)
+ tracker.onDrag(dragDistance)
return Offset.Zero
}
})
diff --git a/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewActivity.kt b/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewActivity.kt
index 9a43009..68c479d 100644
--- a/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewActivity.kt
+++ b/ui/ui-tooling/src/main/java/androidx/ui/tooling/preview/PreviewActivity.kt
@@ -20,12 +20,13 @@
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
-import androidx.compose.runtime.currentComposer
-import androidx.compose.runtime.state
-import androidx.compose.ui.platform.setContent
import androidx.compose.foundation.Text
import androidx.compose.material.ExtendedFloatingActionButton
import androidx.compose.material.Scaffold
+import androidx.compose.runtime.currentComposer
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.setContent
/**
* Activity used to run `@Composable` previews from Android Studio.
@@ -98,7 +99,7 @@
// cycle through all the values.
if (previewParameters.size > 1) {
setContent {
- val index = state { 0 }
+ val index = remember { mutableStateOf(0) }
Scaffold(bodyContent = {
invokeComposableViaReflection(