Merge "Resolving buildSrc configurations at configuation time" into androidx-master-dev
diff --git a/activity/activity/api/1.2.0-alpha05.txt b/activity/activity/api/1.2.0-alpha05.txt
index 6b0e31f..bd410fe 100644
--- a/activity/activity/api/1.2.0-alpha05.txt
+++ b/activity/activity/api/1.2.0-alpha05.txt
@@ -203,11 +203,11 @@
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
- public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+ public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
- method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
- method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!>? getSynchronousResult(android.content.Context, android.net.Uri);
+ method public final Boolean parseResult(int, android.content.Intent?);
}
public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
diff --git a/activity/activity/api/current.txt b/activity/activity/api/current.txt
index 6b0e31f..bd410fe 100644
--- a/activity/activity/api/current.txt
+++ b/activity/activity/api/current.txt
@@ -203,11 +203,11 @@
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
- public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+ public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
- method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
- method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!>? getSynchronousResult(android.content.Context, android.net.Uri);
+ method public final Boolean parseResult(int, android.content.Intent?);
}
public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
diff --git a/activity/activity/api/public_plus_experimental_1.2.0-alpha05.txt b/activity/activity/api/public_plus_experimental_1.2.0-alpha05.txt
index 9bfc435..bdd0997 100644
--- a/activity/activity/api/public_plus_experimental_1.2.0-alpha05.txt
+++ b/activity/activity/api/public_plus_experimental_1.2.0-alpha05.txt
@@ -202,11 +202,11 @@
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
- public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+ public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
- method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
- method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!>? getSynchronousResult(android.content.Context, android.net.Uri);
+ method public final Boolean parseResult(int, android.content.Intent?);
}
public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
diff --git a/activity/activity/api/public_plus_experimental_current.txt b/activity/activity/api/public_plus_experimental_current.txt
index 9bfc435..bdd0997 100644
--- a/activity/activity/api/public_plus_experimental_current.txt
+++ b/activity/activity/api/public_plus_experimental_current.txt
@@ -202,11 +202,11 @@
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
- public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+ public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
- method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
- method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!>? getSynchronousResult(android.content.Context, android.net.Uri);
+ method public final Boolean parseResult(int, android.content.Intent?);
}
public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
diff --git a/activity/activity/api/restricted_1.2.0-alpha05.txt b/activity/activity/api/restricted_1.2.0-alpha05.txt
index 9bfc435..bdd0997 100644
--- a/activity/activity/api/restricted_1.2.0-alpha05.txt
+++ b/activity/activity/api/restricted_1.2.0-alpha05.txt
@@ -202,11 +202,11 @@
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
- public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+ public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
- method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
- method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!>? getSynchronousResult(android.content.Context, android.net.Uri);
+ method public final Boolean parseResult(int, android.content.Intent?);
}
public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
diff --git a/activity/activity/api/restricted_current.txt b/activity/activity/api/restricted_current.txt
index 9bfc435..bdd0997 100644
--- a/activity/activity/api/restricted_current.txt
+++ b/activity/activity/api/restricted_current.txt
@@ -202,11 +202,11 @@
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
- public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+ public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context, android.net.Uri);
- method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap!>? getSynchronousResult(android.content.Context, android.net.Uri);
- method public final android.graphics.Bitmap? parseResult(int, android.content.Intent?);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean!>? getSynchronousResult(android.content.Context, android.net.Uri);
+ method public final Boolean parseResult(int, android.content.Intent?);
}
public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
diff --git a/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityViewModelTest.kt b/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityViewModelTest.kt
index e52b140..b79499a 100644
--- a/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityViewModelTest.kt
+++ b/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityViewModelTest.kt
@@ -47,10 +47,18 @@
@Test
fun testSameViewModelStorePrePostOnCreate() {
with(ActivityScenario.launch(ViewModelActivity::class.java)) {
+ val originalStore = withActivity { preOnCreateViewModelStore }
assertWithMessage(
"Pre-onCreate() ViewModelStore should equal the post-onCreate() ViewModelStore")
- .that(withActivity { preOnCreateViewModelStore })
+ .that(originalStore)
.isSameInstanceAs(withActivity { postOnCreateViewModelStore })
+
+ recreate()
+
+ assertThat(withActivity { preOnCreateViewModelStore })
+ .isSameInstanceAs(originalStore)
+ assertThat(withActivity { postOnCreateViewModelStore })
+ .isSameInstanceAs(originalStore)
}
}
diff --git a/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java b/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java
index 870a0e2..48ff7a8 100644
--- a/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java
+++ b/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.java
@@ -295,12 +295,12 @@
* {@link MediaStore#ACTION_IMAGE_CAPTURE take a picture} saving it into the provided
* content-{@link Uri}.
* <p>
- * May return a thumbnail of the photo in the result Intent if the camera provides one.
+ * Returns {@code true} if the image was saved into the given {@link Uri}.
* <p>
* This can be extended to override {@link #createIntent} if you wish to pass additional
* extras to the Intent created by {@code super.createIntent()}.
*/
- public static class TakePicture extends ActivityResultContract<Uri, Bitmap> {
+ public static class TakePicture extends ActivityResultContract<Uri, Boolean> {
@CallSuper
@NonNull
@@ -312,16 +312,15 @@
@Nullable
@Override
- public final SynchronousResult<Bitmap> getSynchronousResult(@NonNull Context context,
+ public final SynchronousResult<Boolean> getSynchronousResult(@NonNull Context context,
@NonNull Uri input) {
return null;
}
- @Nullable
+ @NonNull
@Override
- public final Bitmap parseResult(int resultCode, @Nullable Intent intent) {
- if (intent == null || resultCode != Activity.RESULT_OK) return null;
- return intent.getParcelableExtra("data");
+ public final Boolean parseResult(int resultCode, @Nullable Intent intent) {
+ return resultCode == Activity.RESULT_OK;
}
}
diff --git a/activity/integration-tests/testapp/src/main/AndroidManifest.xml b/activity/integration-tests/testapp/src/main/AndroidManifest.xml
index a1848d4..af315b5 100644
--- a/activity/integration-tests/testapp/src/main/AndroidManifest.xml
+++ b/activity/integration-tests/testapp/src/main/AndroidManifest.xml
@@ -27,6 +27,15 @@
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
+ <provider
+ android:name="androidx.core.content.FileProvider"
+ android:authorities="androidx.activity.integration.testapp"
+ android:exported="false"
+ android:grantUriPermissions="true">
+ <meta-data
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/file_paths" />
+ </provider>
</application>
</manifest>
diff --git a/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt b/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt
index 08c66e2..9b92823 100644
--- a/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt
+++ b/activity/integration-tests/testapp/src/main/java/androidx/activity/integration/testapp/MainActivity.kt
@@ -35,7 +35,10 @@
import androidx.activity.result.contract.ActivityResultContracts.OpenMultipleDocuments
import androidx.activity.result.contract.ActivityResultContracts.GetContent
import androidx.activity.result.contract.ActivityResultContracts.RequestPermission
+import androidx.activity.result.contract.ActivityResultContracts.TakePicture
import androidx.activity.result.contract.ActivityResultContracts.TakePicturePreview
+import androidx.core.content.FileProvider
+import java.io.File
class MainActivity : ComponentActivity() {
@@ -44,10 +47,14 @@
toast("Location granted: $isGranted")
}
- val takePicture = registerForActivityResult(TakePicturePreview()) { bitmap ->
+ val takePicturePreview = registerForActivityResult(TakePicturePreview()) { bitmap ->
toast("Got picture: $bitmap")
}
+ val takePicture = registerForActivityResult(TakePicture()) { success ->
+ toast("Got picture: $success")
+ }
+
val getContent = registerForActivityResult(GetContent()) { uri ->
toast("Got image: $uri")
}
@@ -70,8 +77,13 @@
button("Request location permission") {
requestLocation()
}
+ button("Get picture thumbnail") {
+ takePicturePreview()
+ }
button("Take pic") {
- takePicture()
+ val file = File(filesDir, "image")
+ val uri = FileProvider.getUriForFile(this@MainActivity, packageName, file)
+ takePicture(uri)
}
button("Pick an image") {
getContent("image/*")
diff --git a/activity/integration-tests/testapp/src/main/res/xml/file_paths.xml b/activity/integration-tests/testapp/src/main/res/xml/file_paths.xml
new file mode 100644
index 0000000..e64625b
--- /dev/null
+++ b/activity/integration-tests/testapp/src/main/res/xml/file_paths.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ 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.
+ -->
+
+<paths>
+ <files-path name="my_images" path="/"/>
+</paths>
diff --git a/annotation/annotation/api/1.2.0-alpha01.txt b/annotation/annotation/api/1.2.0-alpha01.txt
index 082a397..466cec5 100644
--- a/annotation/annotation/api/1.2.0-alpha01.txt
+++ b/annotation/annotation/api/1.2.0-alpha01.txt
@@ -32,6 +32,13 @@
method public abstract String suggest() default "";
}
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface ChecksSdkIntAtLeast {
+ method public abstract int api() default -1;
+ method public abstract String codename() default "";
+ method public abstract int lambda() default -1;
+ method public abstract int parameter() default -1;
+ }
+
@java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorInt {
}
diff --git a/annotation/annotation/api/current.txt b/annotation/annotation/api/current.txt
index 082a397..466cec5 100644
--- a/annotation/annotation/api/current.txt
+++ b/annotation/annotation/api/current.txt
@@ -32,6 +32,13 @@
method public abstract String suggest() default "";
}
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface ChecksSdkIntAtLeast {
+ method public abstract int api() default -1;
+ method public abstract String codename() default "";
+ method public abstract int lambda() default -1;
+ method public abstract int parameter() default -1;
+ }
+
@java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorInt {
}
diff --git a/annotation/annotation/api/public_plus_experimental_1.2.0-alpha01.txt b/annotation/annotation/api/public_plus_experimental_1.2.0-alpha01.txt
index 082a397..466cec5 100644
--- a/annotation/annotation/api/public_plus_experimental_1.2.0-alpha01.txt
+++ b/annotation/annotation/api/public_plus_experimental_1.2.0-alpha01.txt
@@ -32,6 +32,13 @@
method public abstract String suggest() default "";
}
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface ChecksSdkIntAtLeast {
+ method public abstract int api() default -1;
+ method public abstract String codename() default "";
+ method public abstract int lambda() default -1;
+ method public abstract int parameter() default -1;
+ }
+
@java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorInt {
}
diff --git a/annotation/annotation/api/public_plus_experimental_current.txt b/annotation/annotation/api/public_plus_experimental_current.txt
index 082a397..466cec5 100644
--- a/annotation/annotation/api/public_plus_experimental_current.txt
+++ b/annotation/annotation/api/public_plus_experimental_current.txt
@@ -32,6 +32,13 @@
method public abstract String suggest() default "";
}
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface ChecksSdkIntAtLeast {
+ method public abstract int api() default -1;
+ method public abstract String codename() default "";
+ method public abstract int lambda() default -1;
+ method public abstract int parameter() default -1;
+ }
+
@java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorInt {
}
diff --git a/annotation/annotation/api/restricted_1.2.0-alpha01.txt b/annotation/annotation/api/restricted_1.2.0-alpha01.txt
index 082a397..466cec5 100644
--- a/annotation/annotation/api/restricted_1.2.0-alpha01.txt
+++ b/annotation/annotation/api/restricted_1.2.0-alpha01.txt
@@ -32,6 +32,13 @@
method public abstract String suggest() default "";
}
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface ChecksSdkIntAtLeast {
+ method public abstract int api() default -1;
+ method public abstract String codename() default "";
+ method public abstract int lambda() default -1;
+ method public abstract int parameter() default -1;
+ }
+
@java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorInt {
}
diff --git a/annotation/annotation/api/restricted_current.txt b/annotation/annotation/api/restricted_current.txt
index 082a397..466cec5 100644
--- a/annotation/annotation/api/restricted_current.txt
+++ b/annotation/annotation/api/restricted_current.txt
@@ -32,6 +32,13 @@
method public abstract String suggest() default "";
}
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface ChecksSdkIntAtLeast {
+ method public abstract int api() default -1;
+ method public abstract String codename() default "";
+ method public abstract int lambda() default -1;
+ method public abstract int parameter() default -1;
+ }
+
@java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorInt {
}
diff --git a/annotation/annotation/src/main/java/androidx/annotation/ChecksSdkIntAtLeast.java b/annotation/annotation/src/main/java/androidx/annotation/ChecksSdkIntAtLeast.java
new file mode 100644
index 0000000..6f6d462
--- /dev/null
+++ b/annotation/annotation/src/main/java/androidx/annotation/ChecksSdkIntAtLeast.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 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.annotation;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.RetentionPolicy.CLASS;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * Denotes that the annotated method checks if the SDK_INT API level is
+ * at least the given value, and either returns it or executes the
+ * given lambda in that case (or if it's a field, has the value true).
+ *
+ * The API level can be specified either as an API level via
+ * {@link #api()}, or for preview platforms as a codename (such as "R") via
+ * {@link #codename()}}, or it can be passed in to the method; in that
+ * case, the parameter containing the API level or code name should
+ * be specified via {@link #parameter()}, where the first parameter
+ * is numbered 0.
+ *
+ * <p>
+ * Examples:
+ * <pre><code>
+ * // Simple version check
+ * @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.O)
+ * public static boolean isAtLeastO() {
+ * return Build.VERSION.SDK_INT >= 26;
+ * }
+ *
+ * // Required API level is passed in as first argument, and function
+ * // in second parameter is executed if SDK_INT is at least that high:
+ * @ChecksSdkIntAtLeast(parameter = 0, lambda = 1)
+ * inline fun fromApi(value: Int, action: () -> Unit) {
+ * if (Build.VERSION.SDK_INT >= value) {
+ * action()
+ * }
+ * }
+ *
+ * // Kotlin property:
+ * @get:ChecksSdkIntAtLeast(api = Build.VERSION_CODES.GINGERBREAD)
+ * val isGingerbread: Boolean
+ * get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD
+ *
+ * // Java field:
+ * @ChecksSdkIntAtLeast(api = Build.VERSION_CODES.LOLLIPOP)
+ * public static final boolean SUPPORTS_LETTER_SPACING =
+ * Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
+ *
+ * </code></pre>
+ */
+@Documented
+@Retention(CLASS)
+@Target({METHOD, FIELD})
+public @interface ChecksSdkIntAtLeast {
+ /**
+ * The API level is at least the given level
+ */
+ int api() default -1;
+
+ /**
+ * The API level is at least the given codename (such as "R")
+ */
+ String codename() default "";
+
+ /**
+ * The API level is specified in the given parameter, where the first parameter is number 0
+ */
+ int parameter() default -1;
+
+ /**
+ * The parameter number for a lambda that will be executed if the API level is at least
+ * the value supplied via {@link #api()}, {@link #codename()} or
+ * {@link #parameter()}
+ */
+ int lambda() default -1;
+}
diff --git a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/AppCompatIssueRegistry.kt b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/AppCompatIssueRegistry.kt
index 7b5abaf..29f6185 100644
--- a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/AppCompatIssueRegistry.kt
+++ b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/AppCompatIssueRegistry.kt
@@ -16,6 +16,7 @@
package androidx.appcompat
+import androidx.appcompat.app.SetActionBarDetector
import androidx.appcompat.res.ColorStateListAlphaDetector
import androidx.appcompat.res.ColorStateListLoadingDetector
import androidx.appcompat.res.DrawableLoadingDetector
@@ -31,6 +32,7 @@
class AppCompatIssueRegistry : IssueRegistry() {
override val api = CURRENT_API
override val issues get() = listOf(
+ SetActionBarDetector.USING_CORE_ACTION_BAR,
ColorStateListAlphaDetector.NOT_USING_ANDROID_ALPHA,
ColorStateListLoadingDetector.NOT_USING_COMPAT_LOADING,
DrawableLoadingDetector.NOT_USING_COMPAT_LOADING,
diff --git a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/BaseMethodDeprecationDetector.kt b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/BaseMethodDeprecationDetector.kt
index 7e1f5cc..fd61de5 100644
--- a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/BaseMethodDeprecationDetector.kt
+++ b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/BaseMethodDeprecationDetector.kt
@@ -20,6 +20,7 @@
import com.android.tools.lint.detector.api.Issue
import com.android.tools.lint.detector.api.JavaContext
import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.intellij.psi.PsiClassType
import com.intellij.psi.PsiMethod
import org.jetbrains.uast.UCallExpression
@@ -78,6 +79,17 @@
}
}
+ class SubClassOf(private val superClass: String) : Predicate {
+ override fun matches(
+ context: JavaContext,
+ node: UCallExpression,
+ method: PsiMethod
+ ): Boolean {
+ return context.evaluator.extendsClass(
+ (node.receiverType as? PsiClassType)?.resolve(), superClass, false)
+ }
+ }
+
class MethodLocation(
private val className: String,
val methodName: String,
diff --git a/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/app/SetActionBarDetector.kt b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/app/SetActionBarDetector.kt
new file mode 100644
index 0000000..af31239
--- /dev/null
+++ b/appcompat/appcompat-lint/src/main/kotlin/androidx/appcompat/app/SetActionBarDetector.kt
@@ -0,0 +1,49 @@
+/*
+ * 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.appcompat.app
+
+import androidx.appcompat.BaseMethodDeprecationDetector
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+
+// Flags usage of Activity.setActionBar and suggests converting it to
+// AppCompatActivity.setSupportActionBar
+@Suppress("UnstableApiUsage")
+class SetActionBarDetector : BaseMethodDeprecationDetector(
+ USING_CORE_ACTION_BAR,
+ // Suggest using AppCompatActivity.setSupportActionBar
+ DeprecationCondition(
+ MethodLocation("android.app.Activity", "setActionBar", "android.widget.Toolbar"),
+ "Use `AppCompatActivity.setSupportActionBar`",
+ SubClassOf("androidx.appcompat.app.AppCompatActivity")
+ )
+) {
+ companion object {
+ internal val USING_CORE_ACTION_BAR: Issue = Issue.create(
+ "UseSupportActionBar",
+ "Should not call `Activity.setActionBar` if you extend `AppCompatActivity`",
+ "Use `AppCompatActivity.setSupportActionBar`",
+ Category.CORRECTNESS,
+ 1,
+ Severity.WARNING,
+ Implementation(SetActionBarDetector::class.java, Scope.JAVA_FILE_SCOPE)
+ )
+ }
+}
\ No newline at end of file
diff --git a/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/app/SetActionBarDetectorTest.kt b/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/app/SetActionBarDetectorTest.kt
new file mode 100644
index 0000000..26d34bc
--- /dev/null
+++ b/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/app/SetActionBarDetectorTest.kt
@@ -0,0 +1,128 @@
+/*
+ * 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.appcompat.lint.app
+
+import androidx.appcompat.app.SetActionBarDetector
+import androidx.appcompat.lint.Stubs
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
+import com.android.tools.lint.checks.infrastructure.TestLintTask
+import org.junit.Test
+
+@Suppress("UnstableApiUsage")
+class SetActionBarDetectorTest {
+ @Test
+ fun testExtendCoreActivity() {
+ val customActivityClass = LintDetectorTest.kotlin(
+ "com/example/CustomActivity.kt",
+ """
+ package com.example
+
+ import android.app.Activity
+ import android.os.Bundle
+ import android.widget.Toolbar
+
+ class CustomActivity: Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ setActionBar(Toolbar(this))
+ }
+ }
+ """
+ ).indented().within("src")
+
+ // We expect the class extending the core Activity widget to not be flagged
+ // in setActionBar call
+ TestLintTask.lint().files(
+ customActivityClass
+ ).issues(SetActionBarDetector.USING_CORE_ACTION_BAR)
+ .run()
+ .expectClean()
+ }
+
+ @Test
+ fun testExtendAppCompatActivity() {
+ val customActivityClass = LintDetectorTest.kotlin(
+ "com/example/CustomActivity.kt",
+ """
+ package com.example
+
+ import android.os.Bundle
+ import android.widget.Toolbar
+ import androidx.appcompat.app.AppCompatActivity
+
+ class CustomActivity: AppCompatActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ setActionBar(Toolbar(this))
+ }
+ }
+ """
+ ).indented().within("src")
+
+ // We expect the class extending the AppCompatActivity widget to be flagged
+ // in setActionBar call
+ /* ktlint-disable max-line-length */
+ TestLintTask.lint().files(
+ Stubs.APPCOMPAT_ACTIVITY,
+ customActivityClass
+ ).issues(SetActionBarDetector.USING_CORE_ACTION_BAR)
+ .run()
+ .expect("""
+src/com/example/CustomActivity.kt:9: Warning: Use AppCompatActivity.setSupportActionBar [UseSupportActionBar]
+ setActionBar(Toolbar(this))
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 1 warnings
+ """.trimIndent())
+ /* ktlint-enable max-line-length */
+ }
+
+ @Test
+ fun testDeepExtendAppCompatActivity() {
+ val customActivityClass = LintDetectorTest.kotlin(
+ "com/example/CustomActivity.kt",
+ """
+ package com.example
+
+ import android.os.Bundle
+ import android.widget.Toolbar
+ import androidx.appcompat.app.AppCompatActivity
+
+ class CustomActivity: AppCompatActivity()
+
+ class CustomActivityExt: CustomActivity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ setActionBar(Toolbar(this))
+ }
+ }
+ """
+ ).indented().within("src")
+
+ // We expect the class extending the AppCompatActivity widget to be flagged
+ // in setActionBar call
+ /* ktlint-disable max-line-length */
+ TestLintTask.lint().files(
+ Stubs.APPCOMPAT_ACTIVITY,
+ customActivityClass
+ ).issues(SetActionBarDetector.USING_CORE_ACTION_BAR)
+ .run()
+ .expect("""
+src/com/example/CustomActivity.kt:11: Warning: Use AppCompatActivity.setSupportActionBar [UseSupportActionBar]
+ setActionBar(Toolbar(this))
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+0 errors, 1 warnings
+ """.trimIndent())
+ /* ktlint-enable max-line-length */
+ }
+}
diff --git a/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/res/ColorStateListLoadingDetectorTest.kt b/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/res/ColorStateListLoadingDetectorTest.kt
index 8aadf18..fef4236 100644
--- a/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/res/ColorStateListLoadingDetectorTest.kt
+++ b/appcompat/appcompat-lint/src/test/kotlin/androidx/appcompat/lint/res/ColorStateListLoadingDetectorTest.kt
@@ -32,6 +32,7 @@
package com.example
import android.content.res.ColorStateList
+ import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.content.res.AppCompatResources
diff --git a/appcompat/appcompat-resources/api/1.3.0-alpha01.txt b/appcompat/appcompat-resources/api/1.3.0-alpha01.txt
new file mode 100644
index 0000000..7de85f8
--- /dev/null
+++ b/appcompat/appcompat-resources/api/1.3.0-alpha01.txt
@@ -0,0 +1,35 @@
+// Signature format: 3.0
+package androidx.appcompat.content.res {
+
+ public final class AppCompatResources {
+ method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class AnimatedStateListDrawableCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public AnimatedStateListDrawableCompat();
+ method public void addState(int[], android.graphics.drawable.Drawable, int);
+ method public void addState(int[]!, android.graphics.drawable.Drawable!);
+ method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat! createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+ method public int getOpacity();
+ method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setEnterFadeDuration(int);
+ method public void setExitFadeDuration(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+ }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/public_plus_experimental_1.3.0-alpha01.txt b/appcompat/appcompat-resources/api/public_plus_experimental_1.3.0-alpha01.txt
new file mode 100644
index 0000000..990b059
--- /dev/null
+++ b/appcompat/appcompat-resources/api/public_plus_experimental_1.3.0-alpha01.txt
@@ -0,0 +1,35 @@
+// Signature format: 3.0
+package androidx.appcompat.content.res {
+
+ public final class AppCompatResources {
+ method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class AnimatedStateListDrawableCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback androidx.core.graphics.drawable.TintAwareDrawable {
+ ctor public AnimatedStateListDrawableCompat();
+ method public void addState(int[], android.graphics.drawable.Drawable, int);
+ method public void addState(int[]!, android.graphics.drawable.Drawable!);
+ method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat! createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+ method public int getOpacity();
+ method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setEnterFadeDuration(int);
+ method public void setExitFadeDuration(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+ }
+
+}
+
diff --git a/transition/transition-ktx/api/res-2.0.0-alpha01.txt b/appcompat/appcompat-resources/api/res-1.3.0-alpha01.txt
similarity index 100%
copy from transition/transition-ktx/api/res-2.0.0-alpha01.txt
copy to appcompat/appcompat-resources/api/res-1.3.0-alpha01.txt
diff --git a/appcompat/appcompat-resources/api/restricted_1.3.0-alpha01.txt b/appcompat/appcompat-resources/api/restricted_1.3.0-alpha01.txt
new file mode 100644
index 0000000..1f32e40
--- /dev/null
+++ b/appcompat/appcompat-resources/api/restricted_1.3.0-alpha01.txt
@@ -0,0 +1,90 @@
+// Signature format: 3.0
+package androidx.appcompat.content.res {
+
+ public final class AppCompatResources {
+ method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class AnimatedStateListDrawableCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback androidx.core.graphics.drawable.TintAwareDrawable {
+ ctor public AnimatedStateListDrawableCompat();
+ method public void addState(int[], android.graphics.drawable.Drawable, int);
+ method public void addState(int[]!, android.graphics.drawable.Drawable!);
+ method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat! createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+ method public int getOpacity();
+ method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setEnterFadeDuration(int);
+ method public void setExitFadeDuration(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DrawableWrapper extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public DrawableWrapper(android.graphics.drawable.Drawable!);
+ method public void draw(android.graphics.Canvas!);
+ method public int getOpacity();
+ method public android.graphics.drawable.Drawable! getWrappedDrawable();
+ method public void invalidateDrawable(android.graphics.drawable.Drawable!);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setWrappedDrawable(android.graphics.drawable.Drawable!);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DrawableUtils {
+ method public static boolean canSafelyMutateDrawable(android.graphics.drawable.Drawable);
+ method public static android.graphics.Rect! getOpticalBounds(android.graphics.drawable.Drawable!);
+ method public static android.graphics.PorterDuff.Mode! parseTintMode(int, android.graphics.PorterDuff.Mode!);
+ field public static final android.graphics.Rect! INSETS_NONE;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ResourceManagerInternal {
+ ctor public ResourceManagerInternal();
+ method public static androidx.appcompat.widget.ResourceManagerInternal! get();
+ method public android.graphics.drawable.Drawable! getDrawable(android.content.Context, @DrawableRes int);
+ method public static android.graphics.PorterDuffColorFilter! getPorterDuffColorFilter(int, android.graphics.PorterDuff.Mode!);
+ method public void onConfigurationChanged(android.content.Context);
+ method public void setHooks(androidx.appcompat.widget.ResourceManagerInternal.ResourceManagerHooks!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintContextWrapper extends android.content.ContextWrapper {
+ method public static android.content.Context! wrap(android.content.Context);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintInfo {
+ ctor public TintInfo();
+ field public boolean mHasTintList;
+ field public boolean mHasTintMode;
+ field public android.content.res.ColorStateList! mTintList;
+ field public android.graphics.PorterDuff.Mode! mTintMode;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class VectorEnabledTintResources extends android.content.res.Resources {
+ ctor public VectorEnabledTintResources(android.content.Context, android.content.res.Resources);
+ method public android.graphics.drawable.Drawable! getDrawable(int) throws android.content.res.Resources.NotFoundException;
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public static boolean shouldBeUsed();
+ field public static final int MAX_SDK_WHERE_REQUIRED = 20; // 0x14
+ }
+
+}
+
diff --git a/appcompat/appcompat/api/1.3.0-alpha01.txt b/appcompat/appcompat/api/1.3.0-alpha01.txt
new file mode 100644
index 0000000..aed2d02
--- /dev/null
+++ b/appcompat/appcompat/api/1.3.0-alpha01.txt
@@ -0,0 +1,979 @@
+// Signature format: 3.0
+package androidx.appcompat.app {
+
+ public abstract class ActionBar {
+ ctor public ActionBar();
+ method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public abstract android.view.View! getCustomView();
+ method public abstract int getDisplayOptions();
+ method public float getElevation();
+ method public abstract int getHeight();
+ method public int getHideOffset();
+ method @Deprecated public abstract int getNavigationItemCount();
+ method @Deprecated public abstract int getNavigationMode();
+ method @Deprecated public abstract int getSelectedNavigationIndex();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+ method public abstract CharSequence? getSubtitle();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method @Deprecated public abstract int getTabCount();
+ method public android.content.Context! getThemedContext();
+ method public abstract CharSequence? getTitle();
+ method public abstract void hide();
+ method public boolean isHideOnContentScrollEnabled();
+ method public abstract boolean isShowing();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+ method @Deprecated public abstract void removeAllTabs();
+ method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void removeTabAt(int);
+ method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public abstract void setCustomView(int);
+ method public abstract void setDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayOptions(int);
+ method public abstract void setDisplayOptions(int, int);
+ method public abstract void setDisplayShowCustomEnabled(boolean);
+ method public abstract void setDisplayShowHomeEnabled(boolean);
+ method public abstract void setDisplayShowTitleEnabled(boolean);
+ method public abstract void setDisplayUseLogoEnabled(boolean);
+ method public void setElevation(float);
+ method public void setHideOffset(int);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setHomeActionContentDescription(CharSequence?);
+ method public void setHomeActionContentDescription(@StringRes int);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+ method public void setHomeAsUpIndicator(@DrawableRes int);
+ method public void setHomeButtonEnabled(boolean);
+ method public abstract void setIcon(@DrawableRes int);
+ method public abstract void setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public abstract void setLogo(@DrawableRes int);
+ method public abstract void setLogo(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setNavigationMode(int);
+ method @Deprecated public abstract void setSelectedNavigationItem(int);
+ method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(@StringRes int);
+ method public abstract void show();
+ field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+ field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+ field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+ field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+ field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+ field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+ }
+
+ public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public ActionBar.LayoutParams(int, int);
+ ctor public ActionBar.LayoutParams(int, int, int);
+ ctor public ActionBar.LayoutParams(int);
+ ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ field public int gravity;
+ }
+
+ public static interface ActionBar.OnMenuVisibilityListener {
+ method public void onMenuVisibilityChanged(boolean);
+ }
+
+ @Deprecated public static interface ActionBar.OnNavigationListener {
+ method @Deprecated public boolean onNavigationItemSelected(int, long);
+ }
+
+ @Deprecated public abstract static class ActionBar.Tab {
+ ctor @Deprecated public ActionBar.Tab();
+ method @Deprecated public abstract CharSequence! getContentDescription();
+ method @Deprecated public abstract android.view.View! getCustomView();
+ method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+ method @Deprecated public abstract int getPosition();
+ method @Deprecated public abstract Object! getTag();
+ method @Deprecated public abstract CharSequence! getText();
+ method @Deprecated public abstract void select();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+ field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+ }
+
+ @Deprecated public static interface ActionBar.TabListener {
+ method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ }
+
+ public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+ method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+ method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+ method public boolean isDrawerIndicatorEnabled();
+ method public boolean isDrawerSlideAnimationEnabled();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDrawerClosed(android.view.View!);
+ method public void onDrawerOpened(android.view.View!);
+ method public void onDrawerSlide(android.view.View!, float);
+ method public void onDrawerStateChanged(int);
+ method public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+ method public void setDrawerIndicatorEnabled(boolean);
+ method public void setDrawerSlideAnimationEnabled(boolean);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+ method public void setHomeAsUpIndicator(int);
+ method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+ method public void syncState();
+ }
+
+ public static interface ActionBarDrawerToggle.Delegate {
+ method public android.content.Context! getActionBarThemedContext();
+ method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+ method public boolean isNavigationVisible();
+ method public void setActionBarDescription(@StringRes int);
+ method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+ }
+
+ public static interface ActionBarDrawerToggle.DelegateProvider {
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ }
+
+ public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+ ctor protected AlertDialog(android.content.Context);
+ ctor protected AlertDialog(android.content.Context, @StyleRes int);
+ ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+ method public android.widget.Button! getButton(int);
+ method public android.widget.ListView! getListView();
+ method public void setButton(int, CharSequence!, android.os.Message!);
+ method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+ method public void setCustomTitle(android.view.View!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setIconAttribute(int);
+ method public void setMessage(CharSequence!);
+ method public void setView(android.view.View!);
+ method public void setView(android.view.View!, int, int, int, int);
+ }
+
+ public static class AlertDialog.Builder {
+ ctor public AlertDialog.Builder(android.content.Context);
+ ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+ method public androidx.appcompat.app.AlertDialog create();
+ method public android.content.Context getContext();
+ method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+ method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+ method public androidx.appcompat.app.AlertDialog! show();
+ }
+
+ public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.lifecycle.LifecycleOwner androidx.core.app.TaskStackBuilder.SupportParentable {
+ ctor public AppCompatActivity();
+ ctor @ContentView public AppCompatActivity(@LayoutRes int);
+ method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public android.content.Intent? getSupportParentActivityIntent();
+ method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+ method protected void onNightModeChanged(int);
+ method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+ method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+ method @Deprecated public void onSupportContentChanged();
+ method public boolean onSupportNavigateUp();
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method @Deprecated public void setSupportProgress(int);
+ method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+ method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+ method @Deprecated public void setSupportProgressBarVisibility(boolean);
+ method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void supportInvalidateOptionsMenu();
+ method public void supportNavigateUpTo(android.content.Intent);
+ method public boolean supportRequestWindowFeature(int);
+ method public boolean supportShouldUpRecreateTask(android.content.Intent);
+ }
+
+ public interface AppCompatCallback {
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ }
+
+ public abstract class AppCompatDelegate {
+ method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public abstract boolean applyDayNight();
+ method @Deprecated public void attachBaseContext(android.content.Context!);
+ method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+ method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+ method public static int getDefaultNightMode();
+ method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public int getLocalNightMode();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public abstract boolean hasWindowFeature(int);
+ method public abstract void installViewFactory();
+ method public abstract void invalidateOptionsMenu();
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public abstract boolean isHandleNativeActionModesEnabled();
+ method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+ method public abstract void onCreate(android.os.Bundle!);
+ method public abstract void onDestroy();
+ method public abstract void onPostCreate(android.os.Bundle!);
+ method public abstract void onPostResume();
+ method public abstract void onSaveInstanceState(android.os.Bundle!);
+ method public abstract void onStart();
+ method public abstract void onStop();
+ method public abstract boolean requestWindowFeature(int);
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public abstract void setContentView(android.view.View!);
+ method public abstract void setContentView(@LayoutRes int);
+ method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public static void setDefaultNightMode(int);
+ method public abstract void setHandleNativeActionModesEnabled(boolean);
+ method @RequiresApi(17) public abstract void setLocalNightMode(int);
+ method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method public void setTheme(@StyleRes int);
+ method public abstract void setTitle(CharSequence?);
+ method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+ field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+ field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+ field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+ field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+ field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+ field public static final int MODE_NIGHT_NO = 1; // 0x1
+ field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+ field public static final int MODE_NIGHT_YES = 2; // 0x2
+ }
+
+ public class AppCompatDialog extends android.app.Dialog implements androidx.appcompat.app.AppCompatCallback {
+ ctor public AppCompatDialog(android.content.Context!);
+ ctor public AppCompatDialog(android.content.Context!, int);
+ ctor protected AppCompatDialog(android.content.Context!, boolean, android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AppCompatDelegate! getDelegate();
+ method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean supportRequestWindowFeature(int);
+ }
+
+ public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public AppCompatDialogFragment();
+ }
+
+ public class AppCompatViewInflater {
+ ctor public AppCompatViewInflater();
+ method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+ method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+ ctor public DrawerArrowDrawable(android.content.Context!);
+ method public void draw(android.graphics.Canvas!);
+ method public float getArrowHeadLength();
+ method public float getArrowShaftLength();
+ method public float getBarLength();
+ method public float getBarThickness();
+ method @ColorInt public int getColor();
+ method public int getDirection();
+ method public float getGapSize();
+ method public int getOpacity();
+ method public final android.graphics.Paint! getPaint();
+ method @FloatRange(from=0.0, to=1.0) public float getProgress();
+ method public boolean isSpinEnabled();
+ method public void setAlpha(int);
+ method public void setArrowHeadLength(float);
+ method public void setArrowShaftLength(float);
+ method public void setBarLength(float);
+ method public void setBarThickness(float);
+ method public void setColor(@ColorInt int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDirection(int);
+ method public void setGapSize(float);
+ method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+ method public void setSpinEnabled(boolean);
+ method public void setVerticalMirror(boolean);
+ field public static final int ARROW_DIRECTION_END = 3; // 0x3
+ field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+ field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+ field public static final int ARROW_DIRECTION_START = 2; // 0x2
+ }
+
+}
+
+package androidx.appcompat.view {
+
+ public abstract class ActionMode {
+ ctor public ActionMode();
+ method public abstract void finish();
+ method public abstract android.view.View! getCustomView();
+ method public abstract android.view.Menu! getMenu();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract CharSequence! getSubtitle();
+ method public Object! getTag();
+ method public abstract CharSequence! getTitle();
+ method public boolean getTitleOptionalHint();
+ method public abstract void invalidate();
+ method public boolean isTitleOptional();
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public void setTag(Object!);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(int);
+ method public void setTitleOptionalHint(boolean);
+ }
+
+ public static interface ActionMode.Callback {
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @Deprecated public interface CollapsibleActionView {
+ method @Deprecated public void onActionViewCollapsed();
+ method @Deprecated public void onActionViewExpanded();
+ }
+
+ public class ContextThemeWrapper extends android.content.ContextWrapper {
+ ctor public ContextThemeWrapper();
+ ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+ ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+ method public void applyOverrideConfiguration(android.content.res.Configuration!);
+ method public int getThemeResId();
+ method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
+ ctor public ActionMenuView(android.content.Context);
+ ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public android.view.Menu! getMenu();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method public boolean hideOverflowMenu();
+ method public boolean isOverflowMenuShowing();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDetachedFromWindow();
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+ ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(int, int);
+ field @android.view.ViewDebug.ExportedProperty public int cellsUsed;
+ field @android.view.ViewDebug.ExportedProperty public boolean expandable;
+ field @android.view.ViewDebug.ExportedProperty public int extraPixels;
+ field @android.view.ViewDebug.ExportedProperty public boolean isOverflowButton;
+ field @android.view.ViewDebug.ExportedProperty public boolean preventEdgeOffset;
+ }
+
+ public static interface ActionMenuView.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatButton extends android.widget.Button implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatButton(android.content.Context);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setSupportAllCaps(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatCheckBox(android.content.Context);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
+ ctor public AppCompatCheckedTextView(android.content.Context);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatEditText extends android.widget.EditText implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatEditText(android.content.Context);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatImageButton(android.content.Context);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatImageView(android.content.Context);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatRadioButton(android.content.Context!);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatRatingBar extends android.widget.RatingBar {
+ ctor public AppCompatRatingBar(android.content.Context);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSeekBar extends android.widget.SeekBar {
+ ctor public AppCompatSeekBar(android.content.Context);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatSpinner(android.content.Context);
+ ctor public AppCompatSpinner(android.content.Context, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatTextView extends android.widget.TextView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatTextView(android.content.Context);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+ method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+ }
+
+ public class AppCompatToggleButton extends android.widget.ToggleButton {
+ ctor public AppCompatToggleButton(android.content.Context);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class LinearLayoutCompat extends android.view.ViewGroup {
+ ctor public LinearLayoutCompat(android.content.Context);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public int getBaselineAlignedChildIndex();
+ method public android.graphics.drawable.Drawable! getDividerDrawable();
+ method public int getDividerPadding();
+ method public int getGravity();
+ method public int getOrientation();
+ method public int getShowDividers();
+ method public float getWeightSum();
+ method public boolean isBaselineAligned();
+ method public boolean isMeasureWithLargestChildEnabled();
+ method public void setBaselineAligned(boolean);
+ method public void setBaselineAlignedChildIndex(int);
+ method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+ method public void setDividerPadding(int);
+ method public void setGravity(int);
+ method public void setHorizontalGravity(int);
+ method public void setMeasureWithLargestChildEnabled(boolean);
+ method public void setOrientation(int);
+ method public void setShowDividers(int);
+ method public void setVerticalGravity(int);
+ method public void setWeightSum(float);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+ field public static final int SHOW_DIVIDER_END = 4; // 0x4
+ field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+ field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public LinearLayoutCompat.LayoutParams(int, int);
+ ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(androidx.appcompat.widget.LinearLayoutCompat.LayoutParams!);
+ field public int gravity;
+ field public float weight;
+ }
+
+ public class ListPopupWindow {
+ ctor public ListPopupWindow(android.content.Context);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+ method public void clearListSelection();
+ method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+ method public void dismiss();
+ method public android.view.View? getAnchorView();
+ method @StyleRes public int getAnimationStyle();
+ method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
+ method public int getHeight();
+ method public int getHorizontalOffset();
+ method public int getInputMethodMode();
+ method public android.widget.ListView? getListView();
+ method public int getPromptPosition();
+ method public Object? getSelectedItem();
+ method public long getSelectedItemId();
+ method public int getSelectedItemPosition();
+ method public android.view.View? getSelectedView();
+ method public int getSoftInputMode();
+ method public int getVerticalOffset();
+ method public int getWidth();
+ method public boolean isInputMethodNotNeeded();
+ method public boolean isModal();
+ method public boolean isShowing();
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyPreIme(int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public boolean performItemClick(int);
+ method public void postShow();
+ method public void setAdapter(android.widget.ListAdapter?);
+ method public void setAnchorView(android.view.View?);
+ method public void setAnimationStyle(@StyleRes int);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setContentWidth(int);
+ method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
+ method public void setHeight(int);
+ method public void setHorizontalOffset(int);
+ method public void setInputMethodMode(int);
+ method public void setListSelector(android.graphics.drawable.Drawable!);
+ method public void setModal(boolean);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+ method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+ method public void setPromptPosition(int);
+ method public void setPromptView(android.view.View?);
+ method public void setSelection(int);
+ method public void setSoftInputMode(int);
+ method public void setVerticalOffset(int);
+ method public void setWidth(int);
+ method public void setWindowLayoutType(int);
+ method public void show();
+ field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+ field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+ field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+ field public static final int MATCH_PARENT = -1; // 0xffffffff
+ field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+ field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+ field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+ }
+
+ public class PopupMenu {
+ ctor public PopupMenu(android.content.Context, android.view.View);
+ ctor public PopupMenu(android.content.Context, android.view.View, int);
+ ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public android.view.View.OnTouchListener getDragToOpenListener();
+ method public int getGravity();
+ method public android.view.Menu getMenu();
+ method public android.view.MenuInflater getMenuInflater();
+ method public void inflate(@MenuRes int);
+ method public void setGravity(int);
+ method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+ method public void show();
+ }
+
+ public static interface PopupMenu.OnDismissListener {
+ method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+ }
+
+ public static interface PopupMenu.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+ ctor public SearchView(android.content.Context);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+ method public int getImeOptions();
+ method public int getInputType();
+ method public int getMaxWidth();
+ method public CharSequence! getQuery();
+ method public CharSequence? getQueryHint();
+ method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+ method public boolean isIconfiedByDefault();
+ method public boolean isIconified();
+ method public boolean isQueryRefinementEnabled();
+ method public boolean isSubmitButtonEnabled();
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
+ method public void setIconified(boolean);
+ method public void setIconifiedByDefault(boolean);
+ method public void setImeOptions(int);
+ method public void setInputType(int);
+ method public void setMaxWidth(int);
+ method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+ method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+ method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+ method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+ method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+ method public void setQuery(CharSequence!, boolean);
+ method public void setQueryHint(CharSequence?);
+ method public void setQueryRefinementEnabled(boolean);
+ method public void setSearchableInfo(android.app.SearchableInfo!);
+ method public void setSubmitButtonEnabled(boolean);
+ method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+ }
+
+ public static interface SearchView.OnCloseListener {
+ method public boolean onClose();
+ }
+
+ public static interface SearchView.OnQueryTextListener {
+ method public boolean onQueryTextChange(String!);
+ method public boolean onQueryTextSubmit(String!);
+ }
+
+ public static interface SearchView.OnSuggestionListener {
+ method public boolean onSuggestionClick(int);
+ method public boolean onSuggestionSelect(int);
+ }
+
+ public class ShareActionProvider extends androidx.core.view.ActionProvider {
+ ctor public ShareActionProvider(android.content.Context!);
+ method public android.view.View! onCreateActionView();
+ method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+ method public void setShareHistoryFileName(String!);
+ method public void setShareIntent(android.content.Intent!);
+ field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ }
+
+ public static interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+ }
+
+ public class SwitchCompat extends android.widget.CompoundButton {
+ ctor public SwitchCompat(android.content.Context);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+ method public boolean getShowText();
+ method public boolean getSplitTrack();
+ method public int getSwitchMinWidth();
+ method public int getSwitchPadding();
+ method public CharSequence! getTextOff();
+ method public CharSequence! getTextOn();
+ method public android.graphics.drawable.Drawable! getThumbDrawable();
+ method public int getThumbTextPadding();
+ method public android.content.res.ColorStateList? getThumbTintList();
+ method public android.graphics.PorterDuff.Mode? getThumbTintMode();
+ method public android.graphics.drawable.Drawable! getTrackDrawable();
+ method public android.content.res.ColorStateList? getTrackTintList();
+ method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+ method public void onMeasure(int, int);
+ method public void setShowText(boolean);
+ method public void setSplitTrack(boolean);
+ method public void setSwitchMinWidth(int);
+ method public void setSwitchPadding(int);
+ method public void setSwitchTextAppearance(android.content.Context!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!);
+ method public void setTextOff(CharSequence!);
+ method public void setTextOn(CharSequence!);
+ method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+ method public void setThumbResource(int);
+ method public void setThumbTextPadding(int);
+ method public void setThumbTintList(android.content.res.ColorStateList?);
+ method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+ method public void setTrackResource(int);
+ method public void setTrackTintList(android.content.res.ColorStateList?);
+ method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public static final class ThemedSpinnerAdapter.Helper {
+ ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+ method public android.view.LayoutInflater getDropDownViewInflater();
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public class Toolbar extends android.view.ViewGroup {
+ ctor public Toolbar(android.content.Context);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public CharSequence? getCollapseContentDescription();
+ method public android.graphics.drawable.Drawable? getCollapseIcon();
+ method public int getContentInsetEnd();
+ method public int getContentInsetEndWithActions();
+ method public int getContentInsetLeft();
+ method public int getContentInsetRight();
+ method public int getContentInsetStart();
+ method public int getContentInsetStartWithNavigation();
+ method public int getCurrentContentInsetEnd();
+ method public int getCurrentContentInsetLeft();
+ method public int getCurrentContentInsetRight();
+ method public int getCurrentContentInsetStart();
+ method public android.graphics.drawable.Drawable! getLogo();
+ method public CharSequence! getLogoDescription();
+ method public android.view.Menu! getMenu();
+ method public CharSequence? getNavigationContentDescription();
+ method public android.graphics.drawable.Drawable? getNavigationIcon();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public int getTitleMarginBottom();
+ method public int getTitleMarginEnd();
+ method public int getTitleMarginStart();
+ method public int getTitleMarginTop();
+ method public boolean hasExpandedActionView();
+ method public boolean hideOverflowMenu();
+ method public void inflateMenu(@MenuRes int);
+ method public boolean isOverflowMenuShowing();
+ method public void setCollapseContentDescription(@StringRes int);
+ method public void setCollapseContentDescription(CharSequence?);
+ method public void setCollapseIcon(@DrawableRes int);
+ method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+ method public void setContentInsetEndWithActions(int);
+ method public void setContentInsetStartWithNavigation(int);
+ method public void setContentInsetsAbsolute(int, int);
+ method public void setContentInsetsRelative(int, int);
+ method public void setLogo(@DrawableRes int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setLogoDescription(@StringRes int);
+ method public void setLogoDescription(CharSequence!);
+ method public void setNavigationContentDescription(@StringRes int);
+ method public void setNavigationContentDescription(CharSequence?);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+ method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setSubtitleTextColor(@ColorInt int);
+ method public void setSubtitleTextColor(android.content.res.ColorStateList);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence!);
+ method public void setTitleMargin(int, int, int, int);
+ method public void setTitleMarginBottom(int);
+ method public void setTitleMarginEnd(int);
+ method public void setTitleMarginStart(int);
+ method public void setTitleMarginTop(int);
+ method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setTitleTextColor(@ColorInt int);
+ method public void setTitleTextColor(android.content.res.ColorStateList);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+ ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public Toolbar.LayoutParams(int, int);
+ ctor public Toolbar.LayoutParams(int, int, int);
+ ctor public Toolbar.LayoutParams(int);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ }
+
+ public static interface Toolbar.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+ ctor public Toolbar.SavedState(android.os.Parcel!);
+ ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+ ctor public Toolbar.SavedState(android.os.Parcelable!);
+ field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+ }
+
+ public class TooltipCompat {
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ }
+
+}
+
diff --git a/appcompat/appcompat/api/public_plus_experimental_1.3.0-alpha01.txt b/appcompat/appcompat/api/public_plus_experimental_1.3.0-alpha01.txt
new file mode 100644
index 0000000..6f176e4
--- /dev/null
+++ b/appcompat/appcompat/api/public_plus_experimental_1.3.0-alpha01.txt
@@ -0,0 +1,987 @@
+// Signature format: 3.0
+package androidx.appcompat.app {
+
+ public abstract class ActionBar {
+ ctor public ActionBar();
+ method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public abstract android.view.View! getCustomView();
+ method public abstract int getDisplayOptions();
+ method public float getElevation();
+ method public abstract int getHeight();
+ method public int getHideOffset();
+ method @Deprecated public abstract int getNavigationItemCount();
+ method @Deprecated public abstract int getNavigationMode();
+ method @Deprecated public abstract int getSelectedNavigationIndex();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+ method public abstract CharSequence? getSubtitle();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method @Deprecated public abstract int getTabCount();
+ method public android.content.Context! getThemedContext();
+ method public abstract CharSequence? getTitle();
+ method public abstract void hide();
+ method public boolean isHideOnContentScrollEnabled();
+ method public abstract boolean isShowing();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+ method @Deprecated public abstract void removeAllTabs();
+ method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void removeTabAt(int);
+ method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public abstract void setCustomView(int);
+ method public abstract void setDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayOptions(int);
+ method public abstract void setDisplayOptions(int, int);
+ method public abstract void setDisplayShowCustomEnabled(boolean);
+ method public abstract void setDisplayShowHomeEnabled(boolean);
+ method public abstract void setDisplayShowTitleEnabled(boolean);
+ method public abstract void setDisplayUseLogoEnabled(boolean);
+ method public void setElevation(float);
+ method public void setHideOffset(int);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setHomeActionContentDescription(CharSequence?);
+ method public void setHomeActionContentDescription(@StringRes int);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+ method public void setHomeAsUpIndicator(@DrawableRes int);
+ method public void setHomeButtonEnabled(boolean);
+ method public abstract void setIcon(@DrawableRes int);
+ method public abstract void setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public abstract void setLogo(@DrawableRes int);
+ method public abstract void setLogo(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setNavigationMode(int);
+ method @Deprecated public abstract void setSelectedNavigationItem(int);
+ method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(@StringRes int);
+ method public abstract void show();
+ field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+ field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+ field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+ field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+ field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+ field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+ }
+
+ public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public ActionBar.LayoutParams(int, int);
+ ctor public ActionBar.LayoutParams(int, int, int);
+ ctor public ActionBar.LayoutParams(int);
+ ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ field public int gravity;
+ }
+
+ public static interface ActionBar.OnMenuVisibilityListener {
+ method public void onMenuVisibilityChanged(boolean);
+ }
+
+ @Deprecated public static interface ActionBar.OnNavigationListener {
+ method @Deprecated public boolean onNavigationItemSelected(int, long);
+ }
+
+ @Deprecated public abstract static class ActionBar.Tab {
+ ctor @Deprecated public ActionBar.Tab();
+ method @Deprecated public abstract CharSequence! getContentDescription();
+ method @Deprecated public abstract android.view.View! getCustomView();
+ method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+ method @Deprecated public abstract int getPosition();
+ method @Deprecated public abstract Object! getTag();
+ method @Deprecated public abstract CharSequence! getText();
+ method @Deprecated public abstract void select();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+ field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+ }
+
+ @Deprecated public static interface ActionBar.TabListener {
+ method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ }
+
+ public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+ method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+ method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+ method public boolean isDrawerIndicatorEnabled();
+ method public boolean isDrawerSlideAnimationEnabled();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDrawerClosed(android.view.View!);
+ method public void onDrawerOpened(android.view.View!);
+ method public void onDrawerSlide(android.view.View!, float);
+ method public void onDrawerStateChanged(int);
+ method public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+ method public void setDrawerIndicatorEnabled(boolean);
+ method public void setDrawerSlideAnimationEnabled(boolean);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+ method public void setHomeAsUpIndicator(int);
+ method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+ method public void syncState();
+ }
+
+ public static interface ActionBarDrawerToggle.Delegate {
+ method public android.content.Context! getActionBarThemedContext();
+ method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+ method public boolean isNavigationVisible();
+ method public void setActionBarDescription(@StringRes int);
+ method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+ }
+
+ public static interface ActionBarDrawerToggle.DelegateProvider {
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ }
+
+ public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+ ctor protected AlertDialog(android.content.Context);
+ ctor protected AlertDialog(android.content.Context, @StyleRes int);
+ ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+ method public android.widget.Button! getButton(int);
+ method public android.widget.ListView! getListView();
+ method public void setButton(int, CharSequence!, android.os.Message!);
+ method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+ method public void setCustomTitle(android.view.View!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setIconAttribute(int);
+ method public void setMessage(CharSequence!);
+ method public void setView(android.view.View!);
+ method public void setView(android.view.View!, int, int, int, int);
+ }
+
+ public static class AlertDialog.Builder {
+ ctor public AlertDialog.Builder(android.content.Context);
+ ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+ method public androidx.appcompat.app.AlertDialog create();
+ method public android.content.Context getContext();
+ method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+ method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+ method public androidx.appcompat.app.AlertDialog! show();
+ }
+
+ public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.core.app.TaskStackBuilder.SupportParentable {
+ ctor public AppCompatActivity();
+ ctor @ContentView public AppCompatActivity(@LayoutRes int);
+ method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public android.content.Intent? getSupportParentActivityIntent();
+ method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+ method protected void onNightModeChanged(int);
+ method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+ method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+ method @Deprecated public void onSupportContentChanged();
+ method public boolean onSupportNavigateUp();
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method @Deprecated public void setSupportProgress(int);
+ method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+ method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+ method @Deprecated public void setSupportProgressBarVisibility(boolean);
+ method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void supportInvalidateOptionsMenu();
+ method public void supportNavigateUpTo(android.content.Intent);
+ method public boolean supportRequestWindowFeature(int);
+ method public boolean supportShouldUpRecreateTask(android.content.Intent);
+ }
+
+ public interface AppCompatCallback {
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ }
+
+ public abstract class AppCompatDelegate {
+ method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public abstract boolean applyDayNight();
+ method @Deprecated public void attachBaseContext(android.content.Context!);
+ method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+ method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+ method public static int getDefaultNightMode();
+ method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public int getLocalNightMode();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public abstract boolean hasWindowFeature(int);
+ method public abstract void installViewFactory();
+ method public abstract void invalidateOptionsMenu();
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public abstract boolean isHandleNativeActionModesEnabled();
+ method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+ method public abstract void onCreate(android.os.Bundle!);
+ method public abstract void onDestroy();
+ method public abstract void onPostCreate(android.os.Bundle!);
+ method public abstract void onPostResume();
+ method public abstract void onSaveInstanceState(android.os.Bundle!);
+ method public abstract void onStart();
+ method public abstract void onStop();
+ method public abstract boolean requestWindowFeature(int);
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public abstract void setContentView(android.view.View!);
+ method public abstract void setContentView(@LayoutRes int);
+ method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public static void setDefaultNightMode(int);
+ method public abstract void setHandleNativeActionModesEnabled(boolean);
+ method @RequiresApi(17) public abstract void setLocalNightMode(int);
+ method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method public void setTheme(@StyleRes int);
+ method public abstract void setTitle(CharSequence?);
+ method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+ field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+ field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+ field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+ field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+ field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+ field public static final int MODE_NIGHT_NO = 1; // 0x1
+ field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+ field public static final int MODE_NIGHT_YES = 2; // 0x2
+ }
+
+ public class AppCompatDialog extends android.app.Dialog implements androidx.appcompat.app.AppCompatCallback {
+ ctor public AppCompatDialog(android.content.Context!);
+ ctor public AppCompatDialog(android.content.Context!, int);
+ ctor protected AppCompatDialog(android.content.Context!, boolean, android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AppCompatDelegate! getDelegate();
+ method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean supportRequestWindowFeature(int);
+ }
+
+ public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public AppCompatDialogFragment();
+ }
+
+ public class AppCompatViewInflater {
+ ctor public AppCompatViewInflater();
+ method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+ method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+ ctor public DrawerArrowDrawable(android.content.Context!);
+ method public void draw(android.graphics.Canvas!);
+ method public float getArrowHeadLength();
+ method public float getArrowShaftLength();
+ method public float getBarLength();
+ method public float getBarThickness();
+ method @ColorInt public int getColor();
+ method public int getDirection();
+ method public float getGapSize();
+ method public int getOpacity();
+ method public final android.graphics.Paint! getPaint();
+ method @FloatRange(from=0.0, to=1.0) public float getProgress();
+ method public boolean isSpinEnabled();
+ method public void setAlpha(int);
+ method public void setArrowHeadLength(float);
+ method public void setArrowShaftLength(float);
+ method public void setBarLength(float);
+ method public void setBarThickness(float);
+ method public void setColor(@ColorInt int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDirection(int);
+ method public void setGapSize(float);
+ method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+ method public void setSpinEnabled(boolean);
+ method public void setVerticalMirror(boolean);
+ field public static final int ARROW_DIRECTION_END = 3; // 0x3
+ field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+ field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+ field public static final int ARROW_DIRECTION_START = 2; // 0x2
+ }
+
+}
+
+package androidx.appcompat.view {
+
+ public abstract class ActionMode {
+ ctor public ActionMode();
+ method public abstract void finish();
+ method public abstract android.view.View! getCustomView();
+ method public abstract android.view.Menu! getMenu();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract CharSequence! getSubtitle();
+ method public Object! getTag();
+ method public abstract CharSequence! getTitle();
+ method public boolean getTitleOptionalHint();
+ method public abstract void invalidate();
+ method public boolean isTitleOptional();
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public void setTag(Object!);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(int);
+ method public void setTitleOptionalHint(boolean);
+ }
+
+ public static interface ActionMode.Callback {
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @Deprecated public interface CollapsibleActionView {
+ method @Deprecated public void onActionViewCollapsed();
+ method @Deprecated public void onActionViewExpanded();
+ }
+
+ public class ContextThemeWrapper extends android.content.ContextWrapper {
+ ctor public ContextThemeWrapper();
+ ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+ ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+ method public void applyOverrideConfiguration(android.content.res.Configuration!);
+ method public int getThemeResId();
+ method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
+ ctor public ActionMenuView(android.content.Context);
+ ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public android.view.Menu! getMenu();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method public boolean hideOverflowMenu();
+ method public boolean isOverflowMenuShowing();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDetachedFromWindow();
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+ ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(int, int);
+ field @android.view.ViewDebug.ExportedProperty public int cellsUsed;
+ field @android.view.ViewDebug.ExportedProperty public boolean expandable;
+ field @android.view.ViewDebug.ExportedProperty public int extraPixels;
+ field @android.view.ViewDebug.ExportedProperty public boolean isOverflowButton;
+ field @android.view.ViewDebug.ExportedProperty public boolean preventEdgeOffset;
+ }
+
+ public static interface ActionMenuView.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatButton(android.content.Context);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setSupportAllCaps(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatCheckBox(android.content.Context);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
+ ctor public AppCompatCheckedTextView(android.content.Context);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatEditText extends android.widget.EditText implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatEditText(android.content.Context);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+ ctor public AppCompatImageButton(android.content.Context);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+ ctor public AppCompatImageView(android.content.Context);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatRadioButton(android.content.Context!);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatRatingBar extends android.widget.RatingBar {
+ ctor public AppCompatRatingBar(android.content.Context);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSeekBar extends android.widget.SeekBar {
+ ctor public AppCompatSeekBar(android.content.Context);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatSpinner(android.content.Context);
+ ctor public AppCompatSpinner(android.content.Context, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatTextView(android.content.Context);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+ method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+ }
+
+ public class AppCompatToggleButton extends android.widget.ToggleButton {
+ ctor public AppCompatToggleButton(android.content.Context);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class LinearLayoutCompat extends android.view.ViewGroup {
+ ctor public LinearLayoutCompat(android.content.Context);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public int getBaselineAlignedChildIndex();
+ method public android.graphics.drawable.Drawable! getDividerDrawable();
+ method public int getDividerPadding();
+ method public int getGravity();
+ method public int getOrientation();
+ method public int getShowDividers();
+ method public float getWeightSum();
+ method public boolean isBaselineAligned();
+ method public boolean isMeasureWithLargestChildEnabled();
+ method public void setBaselineAligned(boolean);
+ method public void setBaselineAlignedChildIndex(int);
+ method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+ method public void setDividerPadding(int);
+ method public void setGravity(int);
+ method public void setHorizontalGravity(int);
+ method public void setMeasureWithLargestChildEnabled(boolean);
+ method public void setOrientation(int);
+ method public void setShowDividers(int);
+ method public void setVerticalGravity(int);
+ method public void setWeightSum(float);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+ field public static final int SHOW_DIVIDER_END = 4; // 0x4
+ field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+ field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public LinearLayoutCompat.LayoutParams(int, int);
+ ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(androidx.appcompat.widget.LinearLayoutCompat.LayoutParams!);
+ field public int gravity;
+ field public float weight;
+ }
+
+ public class ListPopupWindow {
+ ctor public ListPopupWindow(android.content.Context);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+ method public void clearListSelection();
+ method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+ method public void dismiss();
+ method public android.view.View? getAnchorView();
+ method @StyleRes public int getAnimationStyle();
+ method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
+ method public int getHeight();
+ method public int getHorizontalOffset();
+ method public int getInputMethodMode();
+ method public android.widget.ListView? getListView();
+ method public int getPromptPosition();
+ method public Object? getSelectedItem();
+ method public long getSelectedItemId();
+ method public int getSelectedItemPosition();
+ method public android.view.View? getSelectedView();
+ method public int getSoftInputMode();
+ method public int getVerticalOffset();
+ method public int getWidth();
+ method public boolean isInputMethodNotNeeded();
+ method public boolean isModal();
+ method public boolean isShowing();
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyPreIme(int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public boolean performItemClick(int);
+ method public void postShow();
+ method public void setAdapter(android.widget.ListAdapter?);
+ method public void setAnchorView(android.view.View?);
+ method public void setAnimationStyle(@StyleRes int);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setContentWidth(int);
+ method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
+ method public void setHeight(int);
+ method public void setHorizontalOffset(int);
+ method public void setInputMethodMode(int);
+ method public void setListSelector(android.graphics.drawable.Drawable!);
+ method public void setModal(boolean);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+ method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+ method public void setPromptPosition(int);
+ method public void setPromptView(android.view.View?);
+ method public void setSelection(int);
+ method public void setSoftInputMode(int);
+ method public void setVerticalOffset(int);
+ method public void setWidth(int);
+ method public void setWindowLayoutType(int);
+ method public void show();
+ field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+ field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+ field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+ field public static final int MATCH_PARENT = -1; // 0xffffffff
+ field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+ field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+ field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+ }
+
+ public class PopupMenu {
+ ctor public PopupMenu(android.content.Context, android.view.View);
+ ctor public PopupMenu(android.content.Context, android.view.View, int);
+ ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public android.view.View.OnTouchListener getDragToOpenListener();
+ method public int getGravity();
+ method public android.view.Menu getMenu();
+ method public android.view.MenuInflater getMenuInflater();
+ method public void inflate(@MenuRes int);
+ method public void setGravity(int);
+ method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+ method public void show();
+ }
+
+ public static interface PopupMenu.OnDismissListener {
+ method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+ }
+
+ public static interface PopupMenu.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+ ctor public SearchView(android.content.Context);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+ method public int getImeOptions();
+ method public int getInputType();
+ method public int getMaxWidth();
+ method public CharSequence! getQuery();
+ method public CharSequence? getQueryHint();
+ method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+ method public boolean isIconfiedByDefault();
+ method public boolean isIconified();
+ method public boolean isQueryRefinementEnabled();
+ method public boolean isSubmitButtonEnabled();
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
+ method public void setIconified(boolean);
+ method public void setIconifiedByDefault(boolean);
+ method public void setImeOptions(int);
+ method public void setInputType(int);
+ method public void setMaxWidth(int);
+ method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+ method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+ method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+ method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+ method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+ method public void setQuery(CharSequence!, boolean);
+ method public void setQueryHint(CharSequence?);
+ method public void setQueryRefinementEnabled(boolean);
+ method public void setSearchableInfo(android.app.SearchableInfo!);
+ method public void setSubmitButtonEnabled(boolean);
+ method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+ }
+
+ public static interface SearchView.OnCloseListener {
+ method public boolean onClose();
+ }
+
+ public static interface SearchView.OnQueryTextListener {
+ method public boolean onQueryTextChange(String!);
+ method public boolean onQueryTextSubmit(String!);
+ }
+
+ public static interface SearchView.OnSuggestionListener {
+ method public boolean onSuggestionClick(int);
+ method public boolean onSuggestionSelect(int);
+ }
+
+ public class ShareActionProvider extends androidx.core.view.ActionProvider {
+ ctor public ShareActionProvider(android.content.Context!);
+ method public android.view.View! onCreateActionView();
+ method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+ method public void setShareHistoryFileName(String!);
+ method public void setShareIntent(android.content.Intent!);
+ field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ }
+
+ public static interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+ }
+
+ public class SwitchCompat extends android.widget.CompoundButton {
+ ctor public SwitchCompat(android.content.Context);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+ method public boolean getShowText();
+ method public boolean getSplitTrack();
+ method public int getSwitchMinWidth();
+ method public int getSwitchPadding();
+ method public CharSequence! getTextOff();
+ method public CharSequence! getTextOn();
+ method public android.graphics.drawable.Drawable! getThumbDrawable();
+ method public int getThumbTextPadding();
+ method public android.content.res.ColorStateList? getThumbTintList();
+ method public android.graphics.PorterDuff.Mode? getThumbTintMode();
+ method public android.graphics.drawable.Drawable! getTrackDrawable();
+ method public android.content.res.ColorStateList? getTrackTintList();
+ method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+ method public void onMeasure(int, int);
+ method public void setShowText(boolean);
+ method public void setSplitTrack(boolean);
+ method public void setSwitchMinWidth(int);
+ method public void setSwitchPadding(int);
+ method public void setSwitchTextAppearance(android.content.Context!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!);
+ method public void setTextOff(CharSequence!);
+ method public void setTextOn(CharSequence!);
+ method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+ method public void setThumbResource(int);
+ method public void setThumbTextPadding(int);
+ method public void setThumbTintList(android.content.res.ColorStateList?);
+ method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+ method public void setTrackResource(int);
+ method public void setTrackTintList(android.content.res.ColorStateList?);
+ method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public static final class ThemedSpinnerAdapter.Helper {
+ ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+ method public android.view.LayoutInflater getDropDownViewInflater();
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public class Toolbar extends android.view.ViewGroup {
+ ctor public Toolbar(android.content.Context);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public CharSequence? getCollapseContentDescription();
+ method public android.graphics.drawable.Drawable? getCollapseIcon();
+ method public int getContentInsetEnd();
+ method public int getContentInsetEndWithActions();
+ method public int getContentInsetLeft();
+ method public int getContentInsetRight();
+ method public int getContentInsetStart();
+ method public int getContentInsetStartWithNavigation();
+ method public int getCurrentContentInsetEnd();
+ method public int getCurrentContentInsetLeft();
+ method public int getCurrentContentInsetRight();
+ method public int getCurrentContentInsetStart();
+ method public android.graphics.drawable.Drawable! getLogo();
+ method public CharSequence! getLogoDescription();
+ method public android.view.Menu! getMenu();
+ method public CharSequence? getNavigationContentDescription();
+ method public android.graphics.drawable.Drawable? getNavigationIcon();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public int getTitleMarginBottom();
+ method public int getTitleMarginEnd();
+ method public int getTitleMarginStart();
+ method public int getTitleMarginTop();
+ method public boolean hasExpandedActionView();
+ method public boolean hideOverflowMenu();
+ method public void inflateMenu(@MenuRes int);
+ method public boolean isOverflowMenuShowing();
+ method public void setCollapseContentDescription(@StringRes int);
+ method public void setCollapseContentDescription(CharSequence?);
+ method public void setCollapseIcon(@DrawableRes int);
+ method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+ method public void setContentInsetEndWithActions(int);
+ method public void setContentInsetStartWithNavigation(int);
+ method public void setContentInsetsAbsolute(int, int);
+ method public void setContentInsetsRelative(int, int);
+ method public void setLogo(@DrawableRes int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setLogoDescription(@StringRes int);
+ method public void setLogoDescription(CharSequence!);
+ method public void setNavigationContentDescription(@StringRes int);
+ method public void setNavigationContentDescription(CharSequence?);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+ method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setSubtitleTextColor(@ColorInt int);
+ method public void setSubtitleTextColor(android.content.res.ColorStateList);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence!);
+ method public void setTitleMargin(int, int, int, int);
+ method public void setTitleMarginBottom(int);
+ method public void setTitleMarginEnd(int);
+ method public void setTitleMarginStart(int);
+ method public void setTitleMarginTop(int);
+ method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setTitleTextColor(@ColorInt int);
+ method public void setTitleTextColor(android.content.res.ColorStateList);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+ ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public Toolbar.LayoutParams(int, int);
+ ctor public Toolbar.LayoutParams(int, int, int);
+ ctor public Toolbar.LayoutParams(int);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ }
+
+ public static interface Toolbar.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+ ctor public Toolbar.SavedState(android.os.Parcel!);
+ ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+ ctor public Toolbar.SavedState(android.os.Parcelable!);
+ field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+ }
+
+ public class TooltipCompat {
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ }
+
+}
+
diff --git a/appcompat/appcompat/api/res-1.3.0-alpha01.txt b/appcompat/appcompat/api/res-1.3.0-alpha01.txt
new file mode 100644
index 0000000..cb8c1e3
--- /dev/null
+++ b/appcompat/appcompat/api/res-1.3.0-alpha01.txt
@@ -0,0 +1,366 @@
+attr actionBarDivider
+attr actionBarItemBackground
+attr actionBarPopupTheme
+attr actionBarSize
+attr actionBarSplitStyle
+attr actionBarStyle
+attr actionBarTabBarStyle
+attr actionBarTabStyle
+attr actionBarTabTextStyle
+attr actionBarTheme
+attr actionBarWidgetTheme
+attr actionButtonStyle
+attr actionDropDownStyle
+attr actionLayout
+attr actionMenuTextAppearance
+attr actionMenuTextColor
+attr actionModeBackground
+attr actionModeCloseButtonStyle
+attr actionModeCloseDrawable
+attr actionModeCopyDrawable
+attr actionModeCutDrawable
+attr actionModeFindDrawable
+attr actionModePasteDrawable
+attr actionModeSelectAllDrawable
+attr actionModeShareDrawable
+attr actionModeSplitBackground
+attr actionModeStyle
+attr actionModeWebSearchDrawable
+attr actionOverflowButtonStyle
+attr actionOverflowMenuStyle
+attr actionProviderClass
+attr actionViewClass
+attr alertDialogStyle
+attr alertDialogTheme
+attr arrowHeadLength
+attr arrowShaftLength
+attr autoCompleteTextViewStyle
+attr autoSizeMaxTextSize
+attr autoSizeMinTextSize
+attr autoSizePresetSizes
+attr autoSizeStepGranularity
+attr autoSizeTextType
+attr background
+attr backgroundSplit
+attr backgroundStacked
+attr backgroundTint
+attr backgroundTintMode
+attr barLength
+attr borderlessButtonStyle
+attr buttonBarButtonStyle
+attr buttonBarNegativeButtonStyle
+attr buttonBarNeutralButtonStyle
+attr buttonBarPositiveButtonStyle
+attr buttonBarStyle
+attr buttonGravity
+attr buttonStyle
+attr buttonStyleSmall
+attr buttonTint
+attr buttonTintMode
+attr checkboxStyle
+attr checkedTextViewStyle
+attr closeIcon
+attr closeItemLayout
+attr collapseContentDescription
+attr collapseIcon
+attr color
+attr colorAccent
+attr colorBackgroundFloating
+attr colorButtonNormal
+attr colorControlActivated
+attr colorControlHighlight
+attr colorControlNormal
+attr colorError
+attr colorPrimary
+attr colorPrimaryDark
+attr commitIcon
+attr contentInsetEnd
+attr contentInsetEndWithActions
+attr contentInsetLeft
+attr contentInsetRight
+attr contentInsetStart
+attr contentInsetStartWithNavigation
+attr customNavigationLayout
+attr dialogCornerRadius
+attr dialogPreferredPadding
+attr dialogTheme
+attr displayOptions
+attr divider
+attr dividerHorizontal
+attr dividerPadding
+attr dividerVertical
+attr drawableSize
+attr drawerArrowStyle
+attr dropDownListViewStyle
+attr editTextBackground
+attr editTextColor
+attr editTextStyle
+attr elevation
+attr firstBaselineToTopHeight
+attr fontFamily
+attr fontVariationSettings
+attr gapBetweenBars
+attr goIcon
+attr height
+attr hideOnContentScroll
+attr homeAsUpIndicator
+attr homeLayout
+attr icon
+attr iconTint
+attr iconTintMode
+attr iconifiedByDefault
+attr imageButtonStyle
+attr indeterminateProgressStyle
+attr isLightTheme
+attr itemPadding
+attr lastBaselineToBottomHeight
+attr layout
+attr lineHeight
+attr listChoiceBackgroundIndicator
+attr listChoiceIndicatorMultipleAnimated
+attr listChoiceIndicatorSingleAnimated
+attr listDividerAlertDialog
+attr listPopupWindowStyle
+attr listPreferredItemHeight
+attr listPreferredItemHeightLarge
+attr listPreferredItemHeightSmall
+attr listPreferredItemPaddingEnd
+attr listPreferredItemPaddingLeft
+attr listPreferredItemPaddingRight
+attr listPreferredItemPaddingStart
+attr logo
+attr logoDescription
+attr maxButtonHeight
+attr measureWithLargestChild
+attr navigationContentDescription
+attr navigationIcon
+attr navigationMode
+attr overlapAnchor
+attr paddingEnd
+attr paddingStart
+attr panelBackground
+attr popupMenuStyle
+attr popupTheme
+attr popupWindowStyle
+attr preserveIconSpacing
+attr progressBarPadding
+attr progressBarStyle
+attr queryBackground
+attr queryHint
+attr radioButtonStyle
+attr ratingBarStyle
+attr ratingBarStyleIndicator
+attr ratingBarStyleSmall
+attr searchHintIcon
+attr searchIcon
+attr searchViewStyle
+attr seekBarStyle
+attr selectableItemBackground
+attr selectableItemBackgroundBorderless
+attr showAsAction
+attr showDividers
+attr showText
+attr spinBars
+attr spinnerDropDownItemStyle
+attr spinnerStyle
+attr splitTrack
+attr srcCompat
+attr state_above_anchor
+attr submitBackground
+attr subtitle
+attr subtitleTextAppearance
+attr subtitleTextColor
+attr subtitleTextStyle
+attr suggestionRowLayout
+attr switchMinWidth
+attr switchPadding
+attr switchStyle
+attr switchTextAppearance
+attr textAllCaps
+attr textAppearanceLargePopupMenu
+attr textAppearanceListItem
+attr textAppearanceListItemSecondary
+attr textAppearanceListItemSmall
+attr textAppearancePopupMenuHeader
+attr textAppearanceSearchResultSubtitle
+attr textAppearanceSearchResultTitle
+attr textAppearanceSmallPopupMenu
+attr textColorAlertDialogListItem
+attr textLocale
+attr theme
+attr thickness
+attr thumbTextPadding
+attr thumbTint
+attr thumbTintMode
+attr tickMark
+attr tickMarkTint
+attr tickMarkTintMode
+attr tint
+attr tintMode
+attr title
+attr titleMargin
+attr titleMarginBottom
+attr titleMarginEnd
+attr titleMarginStart
+attr titleMarginTop
+attr titleMargins
+attr titleTextAppearance
+attr titleTextColor
+attr titleTextStyle
+attr toolbarNavigationButtonStyle
+attr toolbarStyle
+attr track
+attr trackTint
+attr trackTintMode
+attr voiceIcon
+attr windowActionBar
+attr windowActionBarOverlay
+attr windowActionModeOverlay
+attr windowNoTitle
+layout support_simple_spinner_dropdown_item
+style TextAppearance_AppCompat
+style TextAppearance_AppCompat_Body1
+style TextAppearance_AppCompat_Body2
+style TextAppearance_AppCompat_Button
+style TextAppearance_AppCompat_Caption
+style TextAppearance_AppCompat_Display1
+style TextAppearance_AppCompat_Display2
+style TextAppearance_AppCompat_Display3
+style TextAppearance_AppCompat_Display4
+style TextAppearance_AppCompat_Headline
+style TextAppearance_AppCompat_Inverse
+style TextAppearance_AppCompat_Large
+style TextAppearance_AppCompat_Large_Inverse
+style TextAppearance_AppCompat_Light_SearchResult_Subtitle
+style TextAppearance_AppCompat_Light_SearchResult_Title
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Medium
+style TextAppearance_AppCompat_Medium_Inverse
+style TextAppearance_AppCompat_Menu
+style TextAppearance_AppCompat_SearchResult_Subtitle
+style TextAppearance_AppCompat_SearchResult_Title
+style TextAppearance_AppCompat_Small
+style TextAppearance_AppCompat_Small_Inverse
+style TextAppearance_AppCompat_Subhead
+style TextAppearance_AppCompat_Subhead_Inverse
+style TextAppearance_AppCompat_Title
+style TextAppearance_AppCompat_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Menu
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Title
+style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Title
+style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse
+style TextAppearance_AppCompat_Widget_Button
+style TextAppearance_AppCompat_Widget_Button_Borderless_Colored
+style TextAppearance_AppCompat_Widget_Button_Colored
+style TextAppearance_AppCompat_Widget_Button_Inverse
+style TextAppearance_AppCompat_Widget_DropDownItem
+style TextAppearance_AppCompat_Widget_PopupMenu_Header
+style TextAppearance_AppCompat_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Widget_Switch
+style TextAppearance_AppCompat_Widget_TextView_SpinnerItem
+style ThemeOverlay_AppCompat
+style ThemeOverlay_AppCompat_ActionBar
+style ThemeOverlay_AppCompat_Dark
+style ThemeOverlay_AppCompat_Dark_ActionBar
+style ThemeOverlay_AppCompat_DayNight
+style ThemeOverlay_AppCompat_DayNight_ActionBar
+style ThemeOverlay_AppCompat_Dialog
+style ThemeOverlay_AppCompat_Dialog_Alert
+style ThemeOverlay_AppCompat_Light
+style Theme_AppCompat
+style Theme_AppCompat_DayNight
+style Theme_AppCompat_DayNight_DarkActionBar
+style Theme_AppCompat_DayNight_Dialog
+style Theme_AppCompat_DayNight_DialogWhenLarge
+style Theme_AppCompat_DayNight_Dialog_Alert
+style Theme_AppCompat_DayNight_Dialog_MinWidth
+style Theme_AppCompat_DayNight_NoActionBar
+style Theme_AppCompat_Dialog
+style Theme_AppCompat_DialogWhenLarge
+style Theme_AppCompat_Dialog_Alert
+style Theme_AppCompat_Dialog_MinWidth
+style Theme_AppCompat_Light
+style Theme_AppCompat_Light_DarkActionBar
+style Theme_AppCompat_Light_Dialog
+style Theme_AppCompat_Light_DialogWhenLarge
+style Theme_AppCompat_Light_Dialog_Alert
+style Theme_AppCompat_Light_Dialog_MinWidth
+style Theme_AppCompat_Light_NoActionBar
+style Theme_AppCompat_NoActionBar
+style Widget_AppCompat_ActionBar
+style Widget_AppCompat_ActionBar_Solid
+style Widget_AppCompat_ActionBar_TabBar
+style Widget_AppCompat_ActionBar_TabText
+style Widget_AppCompat_ActionBar_TabView
+style Widget_AppCompat_ActionButton
+style Widget_AppCompat_ActionButton_CloseMode
+style Widget_AppCompat_ActionButton_Overflow
+style Widget_AppCompat_ActionMode
+style Widget_AppCompat_AutoCompleteTextView
+style Widget_AppCompat_Button
+style Widget_AppCompat_ButtonBar
+style Widget_AppCompat_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Borderless
+style Widget_AppCompat_Button_Borderless_Colored
+style Widget_AppCompat_Button_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Colored
+style Widget_AppCompat_Button_Small
+style Widget_AppCompat_CompoundButton_CheckBox
+style Widget_AppCompat_CompoundButton_RadioButton
+style Widget_AppCompat_CompoundButton_Switch
+style Widget_AppCompat_DrawerArrowToggle
+style Widget_AppCompat_DropDownItem_Spinner
+style Widget_AppCompat_EditText
+style Widget_AppCompat_ImageButton
+style Widget_AppCompat_Light_ActionBar
+style Widget_AppCompat_Light_ActionBar_Solid
+style Widget_AppCompat_Light_ActionBar_Solid_Inverse
+style Widget_AppCompat_Light_ActionBar_TabBar
+style Widget_AppCompat_Light_ActionBar_TabBar_Inverse
+style Widget_AppCompat_Light_ActionBar_TabText
+style Widget_AppCompat_Light_ActionBar_TabText_Inverse
+style Widget_AppCompat_Light_ActionBar_TabView
+style Widget_AppCompat_Light_ActionBar_TabView_Inverse
+style Widget_AppCompat_Light_ActionButton
+style Widget_AppCompat_Light_ActionButton_CloseMode
+style Widget_AppCompat_Light_ActionButton_Overflow
+style Widget_AppCompat_Light_ActionMode_Inverse
+style Widget_AppCompat_Light_AutoCompleteTextView
+style Widget_AppCompat_Light_DropDownItem_Spinner
+style Widget_AppCompat_Light_ListPopupWindow
+style Widget_AppCompat_Light_ListView_DropDown
+style Widget_AppCompat_Light_PopupMenu
+style Widget_AppCompat_Light_PopupMenu_Overflow
+style Widget_AppCompat_Light_SearchView
+style Widget_AppCompat_Light_Spinner_DropDown_ActionBar
+style Widget_AppCompat_ListPopupWindow
+style Widget_AppCompat_ListView
+style Widget_AppCompat_ListView_DropDown
+style Widget_AppCompat_ListView_Menu
+style Widget_AppCompat_PopupMenu
+style Widget_AppCompat_PopupMenu_Overflow
+style Widget_AppCompat_PopupWindow
+style Widget_AppCompat_ProgressBar
+style Widget_AppCompat_ProgressBar_Horizontal
+style Widget_AppCompat_RatingBar
+style Widget_AppCompat_RatingBar_Indicator
+style Widget_AppCompat_RatingBar_Small
+style Widget_AppCompat_SearchView
+style Widget_AppCompat_SearchView_ActionBar
+style Widget_AppCompat_SeekBar
+style Widget_AppCompat_SeekBar_Discrete
+style Widget_AppCompat_Spinner
+style Widget_AppCompat_Spinner_DropDown
+style Widget_AppCompat_Spinner_DropDown_ActionBar
+style Widget_AppCompat_Spinner_Underlined
+style Widget_AppCompat_TextView
+style Widget_AppCompat_TextView_SpinnerItem
+style Widget_AppCompat_Toolbar
+style Widget_AppCompat_Toolbar_Button_Navigation
diff --git a/appcompat/appcompat/api/restricted_1.3.0-alpha01.txt b/appcompat/appcompat/api/restricted_1.3.0-alpha01.txt
new file mode 100644
index 0000000..10b05b7
--- /dev/null
+++ b/appcompat/appcompat/api/restricted_1.3.0-alpha01.txt
@@ -0,0 +1,2204 @@
+// Signature format: 3.0
+package androidx.appcompat.app {
+
+ public abstract class ActionBar {
+ ctor public ActionBar();
+ method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean closeOptionsMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean collapseActionView();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void dispatchMenuVisibilityChanged(boolean);
+ method public abstract android.view.View! getCustomView();
+ method @androidx.appcompat.app.ActionBar.DisplayOptions public abstract int getDisplayOptions();
+ method public float getElevation();
+ method public abstract int getHeight();
+ method public int getHideOffset();
+ method @Deprecated public abstract int getNavigationItemCount();
+ method @Deprecated @androidx.appcompat.app.ActionBar.NavigationMode public abstract int getNavigationMode();
+ method @Deprecated public abstract int getSelectedNavigationIndex();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+ method public abstract CharSequence? getSubtitle();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method @Deprecated public abstract int getTabCount();
+ method public android.content.Context! getThemedContext();
+ method public abstract CharSequence? getTitle();
+ method public abstract void hide();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean invalidateOptionsMenu();
+ method public boolean isHideOnContentScrollEnabled();
+ method public abstract boolean isShowing();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void onConfigurationChanged(android.content.res.Configuration!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean onKeyShortcut(int, android.view.KeyEvent!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean onMenuKeyEvent(android.view.KeyEvent!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean openOptionsMenu();
+ method @Deprecated public abstract void removeAllTabs();
+ method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void removeTabAt(int);
+ method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public abstract void setCustomView(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setDefaultDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayOptions(@androidx.appcompat.app.ActionBar.DisplayOptions int);
+ method public abstract void setDisplayOptions(@androidx.appcompat.app.ActionBar.DisplayOptions int, @androidx.appcompat.app.ActionBar.DisplayOptions int);
+ method public abstract void setDisplayShowCustomEnabled(boolean);
+ method public abstract void setDisplayShowHomeEnabled(boolean);
+ method public abstract void setDisplayShowTitleEnabled(boolean);
+ method public abstract void setDisplayUseLogoEnabled(boolean);
+ method public void setElevation(float);
+ method public void setHideOffset(int);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setHomeActionContentDescription(CharSequence?);
+ method public void setHomeActionContentDescription(@StringRes int);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+ method public void setHomeAsUpIndicator(@DrawableRes int);
+ method public void setHomeButtonEnabled(boolean);
+ method public abstract void setIcon(@DrawableRes int);
+ method public abstract void setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public abstract void setLogo(@DrawableRes int);
+ method public abstract void setLogo(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setNavigationMode(@androidx.appcompat.app.ActionBar.NavigationMode int);
+ method @Deprecated public abstract void setSelectedNavigationItem(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setShowHideAnimationEnabled(boolean);
+ method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(@StringRes int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setWindowTitle(CharSequence!);
+ method public abstract void show();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.view.ActionMode! startActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+ field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+ field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+ field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+ field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+ field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+ }
+
+ @IntDef(flag=true, value={androidx.appcompat.app.ActionBar.DISPLAY_USE_LOGO, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_HOME, androidx.appcompat.app.ActionBar.DISPLAY_HOME_AS_UP, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_TITLE, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_CUSTOM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ActionBar.DisplayOptions {
+ }
+
+ public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public ActionBar.LayoutParams(int, int);
+ ctor public ActionBar.LayoutParams(int, int, int);
+ ctor public ActionBar.LayoutParams(int);
+ ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ field public int gravity;
+ }
+
+ @IntDef({androidx.appcompat.app.ActionBar.NAVIGATION_MODE_STANDARD, androidx.appcompat.app.ActionBar.NAVIGATION_MODE_LIST, androidx.appcompat.app.ActionBar.NAVIGATION_MODE_TABS}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ActionBar.NavigationMode {
+ }
+
+ public static interface ActionBar.OnMenuVisibilityListener {
+ method public void onMenuVisibilityChanged(boolean);
+ }
+
+ @Deprecated public static interface ActionBar.OnNavigationListener {
+ method @Deprecated public boolean onNavigationItemSelected(int, long);
+ }
+
+ @Deprecated public abstract static class ActionBar.Tab {
+ ctor @Deprecated public ActionBar.Tab();
+ method @Deprecated public abstract CharSequence! getContentDescription();
+ method @Deprecated public abstract android.view.View! getCustomView();
+ method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+ method @Deprecated public abstract int getPosition();
+ method @Deprecated public abstract Object! getTag();
+ method @Deprecated public abstract CharSequence! getText();
+ method @Deprecated public abstract void select();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+ field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+ }
+
+ @Deprecated public static interface ActionBar.TabListener {
+ method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ }
+
+ public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+ method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+ method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+ method public boolean isDrawerIndicatorEnabled();
+ method public boolean isDrawerSlideAnimationEnabled();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDrawerClosed(android.view.View!);
+ method public void onDrawerOpened(android.view.View!);
+ method public void onDrawerSlide(android.view.View!, float);
+ method public void onDrawerStateChanged(int);
+ method public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+ method public void setDrawerIndicatorEnabled(boolean);
+ method public void setDrawerSlideAnimationEnabled(boolean);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+ method public void setHomeAsUpIndicator(int);
+ method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+ method public void syncState();
+ }
+
+ public static interface ActionBarDrawerToggle.Delegate {
+ method public android.content.Context! getActionBarThemedContext();
+ method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+ method public boolean isNavigationVisible();
+ method public void setActionBarDescription(@StringRes int);
+ method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+ }
+
+ public static interface ActionBarDrawerToggle.DelegateProvider {
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ }
+
+ public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+ ctor protected AlertDialog(android.content.Context);
+ ctor protected AlertDialog(android.content.Context, @StyleRes int);
+ ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+ method public android.widget.Button! getButton(int);
+ method public android.widget.ListView! getListView();
+ method public void setButton(int, CharSequence!, android.os.Message!);
+ method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+ method public void setCustomTitle(android.view.View!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setIconAttribute(int);
+ method public void setMessage(CharSequence!);
+ method public void setView(android.view.View!);
+ method public void setView(android.view.View!, int, int, int, int);
+ }
+
+ public static class AlertDialog.Builder {
+ ctor public AlertDialog.Builder(android.content.Context);
+ ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+ method public androidx.appcompat.app.AlertDialog create();
+ method public android.content.Context getContext();
+ method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+ method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.app.AlertDialog.Builder! setRecycleOnMeasureEnabled(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!, int, int, int, int);
+ method public androidx.appcompat.app.AlertDialog! show();
+ }
+
+ public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.core.app.TaskStackBuilder.SupportParentable {
+ ctor public AppCompatActivity();
+ ctor @ContentView public AppCompatActivity(@LayoutRes int);
+ method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public android.content.Intent? getSupportParentActivityIntent();
+ method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+ method protected void onNightModeChanged(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+ method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+ method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+ method @Deprecated public void onSupportContentChanged();
+ method public boolean onSupportNavigateUp();
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method @Deprecated public void setSupportProgress(int);
+ method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+ method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+ method @Deprecated public void setSupportProgressBarVisibility(boolean);
+ method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void supportInvalidateOptionsMenu();
+ method public void supportNavigateUpTo(android.content.Intent);
+ method public boolean supportRequestWindowFeature(int);
+ method public boolean supportShouldUpRecreateTask(android.content.Intent);
+ }
+
+ public interface AppCompatCallback {
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ }
+
+ public abstract class AppCompatDelegate {
+ method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public abstract boolean applyDayNight();
+ method @Deprecated public void attachBaseContext(android.content.Context!);
+ method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+ method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+ method @androidx.appcompat.app.AppCompatDelegate.NightMode public static int getDefaultNightMode();
+ method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method @androidx.appcompat.app.AppCompatDelegate.NightMode public int getLocalNightMode();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public abstract boolean hasWindowFeature(int);
+ method public abstract void installViewFactory();
+ method public abstract void invalidateOptionsMenu();
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public abstract boolean isHandleNativeActionModesEnabled();
+ method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+ method public abstract void onCreate(android.os.Bundle!);
+ method public abstract void onDestroy();
+ method public abstract void onPostCreate(android.os.Bundle!);
+ method public abstract void onPostResume();
+ method public abstract void onSaveInstanceState(android.os.Bundle!);
+ method public abstract void onStart();
+ method public abstract void onStop();
+ method public abstract boolean requestWindowFeature(int);
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public abstract void setContentView(android.view.View!);
+ method public abstract void setContentView(@LayoutRes int);
+ method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public static void setDefaultNightMode(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+ method public abstract void setHandleNativeActionModesEnabled(boolean);
+ method @RequiresApi(17) public abstract void setLocalNightMode(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+ method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method public void setTheme(@StyleRes int);
+ method public abstract void setTitle(CharSequence?);
+ method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+ field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+ field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+ field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+ field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+ field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+ field public static final int MODE_NIGHT_NO = 1; // 0x1
+ field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+ field public static final int MODE_NIGHT_YES = 2; // 0x2
+ }
+
+ @IntDef({androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_TIME, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_UNSPECIFIED, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AppCompatDelegate.NightMode {
+ }
+
+ public class AppCompatDialog extends android.app.Dialog implements androidx.appcompat.app.AppCompatCallback {
+ ctor public AppCompatDialog(android.content.Context!);
+ ctor public AppCompatDialog(android.content.Context!, int);
+ ctor protected AppCompatDialog(android.content.Context!, boolean, android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AppCompatDelegate! getDelegate();
+ method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean supportRequestWindowFeature(int);
+ }
+
+ public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public AppCompatDialogFragment();
+ }
+
+ public class AppCompatViewInflater {
+ ctor public AppCompatViewInflater();
+ method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+ method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar extends androidx.appcompat.app.ActionBar implements androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback {
+ ctor public WindowDecorActionBar(android.app.Activity!, boolean);
+ ctor public WindowDecorActionBar(android.app.Dialog!);
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public WindowDecorActionBar(android.view.View!);
+ method public void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public void animateToMode(boolean);
+ method public void doHide(boolean);
+ method public void doShow(boolean);
+ method public void enableContentAnimations(boolean);
+ method public android.view.View! getCustomView();
+ method public int getDisplayOptions();
+ method public int getHeight();
+ method public int getNavigationItemCount();
+ method public int getNavigationMode();
+ method public int getSelectedNavigationIndex();
+ method public androidx.appcompat.app.ActionBar.Tab! getSelectedTab();
+ method public CharSequence! getSubtitle();
+ method public androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method public int getTabCount();
+ method public CharSequence! getTitle();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public void hide();
+ method public void hideForSystem();
+ method public boolean isShowing();
+ method public androidx.appcompat.app.ActionBar.Tab! newTab();
+ method public void onContentScrollStarted();
+ method public void onContentScrollStopped();
+ method public void onWindowVisibilityChanged(int);
+ method public void removeAllTabs();
+ method public void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method public void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public void removeTabAt(int);
+ method public boolean requestFocus();
+ method public void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setCustomView(int);
+ method public void setCustomView(android.view.View!);
+ method public void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public void setDisplayHomeAsUpEnabled(boolean);
+ method public void setDisplayOptions(int);
+ method public void setDisplayOptions(int, int);
+ method public void setDisplayShowCustomEnabled(boolean);
+ method public void setDisplayShowHomeEnabled(boolean);
+ method public void setDisplayShowTitleEnabled(boolean);
+ method public void setDisplayUseLogoEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public void setLogo(int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setNavigationMode(int);
+ method public void setSelectedNavigationItem(int);
+ method public void setSubtitle(int);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(int);
+ method public void setTitle(CharSequence!);
+ method public void show();
+ method public void showForSystem();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar.ActionModeImpl extends androidx.appcompat.view.ActionMode implements androidx.appcompat.view.menu.MenuBuilder.Callback {
+ ctor public WindowDecorActionBar.ActionModeImpl(android.content.Context!, androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean dispatchOnCreate();
+ method public void finish();
+ method public android.view.View! getCustomView();
+ method public android.view.Menu! getMenu();
+ method public android.view.MenuInflater! getMenuInflater();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public void invalidate();
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onCloseSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitle(int);
+ method public void setTitle(CharSequence!);
+ method public void setTitle(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar.TabImpl extends androidx.appcompat.app.ActionBar.Tab {
+ ctor public WindowDecorActionBar.TabImpl();
+ method public androidx.appcompat.app.ActionBar.TabListener! getCallback();
+ method public CharSequence! getContentDescription();
+ method public android.view.View! getCustomView();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public int getPosition();
+ method public Object! getTag();
+ method public CharSequence! getText();
+ method public void select();
+ method public androidx.appcompat.app.ActionBar.Tab! setContentDescription(int);
+ method public androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method public androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method public androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method public androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.ActionBar.Tab! setIcon(int);
+ method public void setPosition(int);
+ method public androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method public androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method public androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method public androidx.appcompat.app.ActionBar.Tab! setText(int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+ ctor public DrawerArrowDrawable(android.content.Context!);
+ method public void draw(android.graphics.Canvas!);
+ method public float getArrowHeadLength();
+ method public float getArrowShaftLength();
+ method public float getBarLength();
+ method public float getBarThickness();
+ method @ColorInt public int getColor();
+ method @androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection public int getDirection();
+ method public float getGapSize();
+ method public int getOpacity();
+ method public final android.graphics.Paint! getPaint();
+ method @FloatRange(from=0.0, to=1.0) public float getProgress();
+ method public boolean isSpinEnabled();
+ method public void setAlpha(int);
+ method public void setArrowHeadLength(float);
+ method public void setArrowShaftLength(float);
+ method public void setBarLength(float);
+ method public void setBarThickness(float);
+ method public void setColor(@ColorInt int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDirection(@androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection int);
+ method public void setGapSize(float);
+ method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+ method public void setSpinEnabled(boolean);
+ method public void setVerticalMirror(boolean);
+ field public static final int ARROW_DIRECTION_END = 3; // 0x3
+ field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+ field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+ field public static final int ARROW_DIRECTION_START = 2; // 0x2
+ }
+
+ @IntDef({androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_LEFT, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_RIGHT, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_START, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface DrawerArrowDrawable.ArrowDirection {
+ }
+
+}
+
+package androidx.appcompat.text {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AllCapsTransformationMethod implements android.text.method.TransformationMethod {
+ ctor public AllCapsTransformationMethod(android.content.Context!);
+ method public CharSequence! getTransformation(CharSequence!, android.view.View!);
+ method public void onFocusChanged(android.view.View!, CharSequence!, boolean, int, android.graphics.Rect!);
+ }
+
+}
+
+package androidx.appcompat.view {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarPolicy {
+ method public boolean enableHomeButtonByDefault();
+ method public static androidx.appcompat.view.ActionBarPolicy! get(android.content.Context!);
+ method public int getEmbeddedMenuWidthLimit();
+ method public int getMaxActionButtons();
+ method public int getStackedTabMaxWidth();
+ method public int getTabContainerHeight();
+ method public boolean hasEmbeddedTabs();
+ method public boolean showsOverflowMenuButton();
+ }
+
+ public abstract class ActionMode {
+ ctor public ActionMode();
+ method public abstract void finish();
+ method public abstract android.view.View! getCustomView();
+ method public abstract android.view.Menu! getMenu();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract CharSequence! getSubtitle();
+ method public Object! getTag();
+ method public abstract CharSequence! getTitle();
+ method public boolean getTitleOptionalHint();
+ method public abstract void invalidate();
+ method public boolean isTitleOptional();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isUiFocusable();
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public void setTag(Object!);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(int);
+ method public void setTitleOptionalHint(boolean);
+ }
+
+ public static interface ActionMode.Callback {
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @Deprecated public interface CollapsibleActionView {
+ method @Deprecated public void onActionViewCollapsed();
+ method @Deprecated public void onActionViewExpanded();
+ }
+
+ public class ContextThemeWrapper extends android.content.ContextWrapper {
+ ctor public ContextThemeWrapper();
+ ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+ ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+ method public void applyOverrideConfiguration(android.content.res.Configuration!);
+ method public int getThemeResId();
+ method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class StandaloneActionMode extends androidx.appcompat.view.ActionMode implements androidx.appcompat.view.menu.MenuBuilder.Callback {
+ ctor public StandaloneActionMode(android.content.Context!, androidx.appcompat.widget.ActionBarContextView!, androidx.appcompat.view.ActionMode.Callback!, boolean);
+ method public void finish();
+ method public android.view.View! getCustomView();
+ method public android.view.Menu! getMenu();
+ method public android.view.MenuInflater! getMenuInflater();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public void invalidate();
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onCloseSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitle(int);
+ method public void setTitle(CharSequence!);
+ method public void setTitle(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SupportActionModeWrapper extends android.view.ActionMode {
+ ctor public SupportActionModeWrapper(android.content.Context!, androidx.appcompat.view.ActionMode!);
+ method public void finish();
+ method public android.view.View! getCustomView();
+ method public android.view.Menu! getMenu();
+ method public android.view.MenuInflater! getMenuInflater();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public void invalidate();
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitle(int);
+ method public void setTitle(CharSequence!);
+ method public void setTitle(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class SupportActionModeWrapper.CallbackWrapper implements androidx.appcompat.view.ActionMode.Callback {
+ ctor public SupportActionModeWrapper.CallbackWrapper(android.content.Context!, android.view.ActionMode.Callback!);
+ method public android.view.ActionMode! getActionModeWrapper(androidx.appcompat.view.ActionMode!);
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SupportMenuInflater extends android.view.MenuInflater {
+ ctor public SupportMenuInflater(android.content.Context!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewPropertyAnimatorCompatSet {
+ ctor public ViewPropertyAnimatorCompatSet();
+ method public void cancel();
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! play(androidx.core.view.ViewPropertyAnimatorCompat!);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! playSequentially(androidx.core.view.ViewPropertyAnimatorCompat!, androidx.core.view.ViewPropertyAnimatorCompat!);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setDuration(long);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setInterpolator(android.view.animation.Interpolator!);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+ method public void start();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowCallbackWrapper implements android.view.Window.Callback {
+ ctor public WindowCallbackWrapper(android.view.Window.Callback!);
+ method public boolean dispatchGenericMotionEvent(android.view.MotionEvent!);
+ method public boolean dispatchKeyEvent(android.view.KeyEvent!);
+ method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent!);
+ method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent!);
+ method public boolean dispatchTouchEvent(android.view.MotionEvent!);
+ method public boolean dispatchTrackballEvent(android.view.MotionEvent!);
+ method public final android.view.Window.Callback! getWrapped();
+ method public void onActionModeFinished(android.view.ActionMode!);
+ method public void onActionModeStarted(android.view.ActionMode!);
+ method public void onAttachedToWindow();
+ method public void onContentChanged();
+ method public boolean onCreatePanelMenu(int, android.view.Menu!);
+ method public android.view.View! onCreatePanelView(int);
+ method public void onDetachedFromWindow();
+ method public boolean onMenuItemSelected(int, android.view.MenuItem!);
+ method public boolean onMenuOpened(int, android.view.Menu!);
+ method public void onPanelClosed(int, android.view.Menu!);
+ method public boolean onPreparePanel(int, android.view.View!, android.view.Menu!);
+ method @RequiresApi(23) public boolean onSearchRequested(android.view.SearchEvent!);
+ method public boolean onSearchRequested();
+ method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams!);
+ method public void onWindowFocusChanged(boolean);
+ method public android.view.ActionMode! onWindowStartingActionMode(android.view.ActionMode.Callback!);
+ method @RequiresApi(23) public android.view.ActionMode! onWindowStartingActionMode(android.view.ActionMode.Callback!, int);
+ }
+
+}
+
+package androidx.appcompat.view.menu {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionMenuItem implements androidx.core.internal.view.SupportMenuItem {
+ ctor public ActionMenuItem(android.content.Context!, int, int, int, int, CharSequence!);
+ method public boolean collapseActionView();
+ method public boolean expandActionView();
+ method public android.view.ActionProvider! getActionProvider();
+ method public android.view.View! getActionView();
+ method public char getAlphabeticShortcut();
+ method public int getGroupId();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public android.content.Intent! getIntent();
+ method public int getItemId();
+ method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+ method public char getNumericShortcut();
+ method public int getOrder();
+ method public android.view.SubMenu! getSubMenu();
+ method public androidx.core.view.ActionProvider! getSupportActionProvider();
+ method public CharSequence! getTitle();
+ method public CharSequence! getTitleCondensed();
+ method public boolean hasSubMenu();
+ method public boolean invoke();
+ method public boolean isActionViewExpanded();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public boolean isVisible();
+ method public boolean requiresActionButton();
+ method public boolean requiresOverflow();
+ method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(android.view.View!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(int);
+ method public android.view.MenuItem! setAlphabeticShortcut(char);
+ method public android.view.MenuItem! setCheckable(boolean);
+ method public android.view.MenuItem! setChecked(boolean);
+ method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+ method public android.view.MenuItem! setEnabled(boolean);
+ method public androidx.appcompat.view.menu.ActionMenuItem! setExclusiveCheckable(boolean);
+ method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.MenuItem! setIcon(int);
+ method public android.view.MenuItem! setIntent(android.content.Intent!);
+ method public android.view.MenuItem! setNumericShortcut(char);
+ method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+ method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+ method public android.view.MenuItem! setShortcut(char, char);
+ method public void setShowAsAction(int);
+ method public androidx.core.internal.view.SupportMenuItem! setShowAsActionFlags(int);
+ method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+ method public android.view.MenuItem! setTitle(CharSequence!);
+ method public android.view.MenuItem! setTitle(int);
+ method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+ method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+ method public android.view.MenuItem! setVisible(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionMenuItemView extends androidx.appcompat.widget.AppCompatTextView implements androidx.appcompat.widget.ActionMenuView.ActionMenuChildView androidx.appcompat.view.menu.MenuView.ItemView android.view.View.OnClickListener {
+ ctor public ActionMenuItemView(android.content.Context!);
+ ctor public ActionMenuItemView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuItemView(android.content.Context!, android.util.AttributeSet!, int);
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+ method public boolean hasText();
+ method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+ method public boolean needsDividerAfter();
+ method public boolean needsDividerBefore();
+ method public void onClick(android.view.View!);
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public boolean prefersCondensedTitle();
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setExpandedFormat(boolean);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setItemInvoker(androidx.appcompat.view.menu.MenuBuilder.ItemInvoker!);
+ method public void setPopupCallback(androidx.appcompat.view.menu.ActionMenuItemView.PopupCallback!);
+ method public void setShortcut(boolean, char);
+ method public void setTitle(CharSequence!);
+ method public boolean showsIcon();
+ }
+
+ public abstract static class ActionMenuItemView.PopupCallback {
+ ctor public ActionMenuItemView.PopupCallback();
+ method public abstract androidx.appcompat.view.menu.ShowableListMenu! getPopup();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class BaseMenuPresenter implements androidx.appcompat.view.menu.MenuPresenter {
+ ctor public BaseMenuPresenter(android.content.Context!, int, int);
+ method protected void addItemView(android.view.View!, int);
+ method public abstract void bindItemView(androidx.appcompat.view.menu.MenuItemImpl!, androidx.appcompat.view.menu.MenuView.ItemView!);
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public androidx.appcompat.view.menu.MenuView.ItemView! createItemView(android.view.ViewGroup!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method protected boolean filterLeftoverView(android.view.ViewGroup!, int);
+ method public boolean flagActionItems();
+ method public androidx.appcompat.view.menu.MenuPresenter.Callback! getCallback();
+ method public int getId();
+ method public android.view.View! getItemView(androidx.appcompat.view.menu.MenuItemImpl!, android.view.View!, android.view.ViewGroup!);
+ method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+ method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setId(int);
+ method public boolean shouldIncludeItem(int, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public void updateMenuView(boolean);
+ field protected android.content.Context! mContext;
+ field protected android.view.LayoutInflater! mInflater;
+ field protected androidx.appcompat.view.menu.MenuBuilder! mMenu;
+ field protected androidx.appcompat.view.menu.MenuView! mMenuView;
+ field protected android.content.Context! mSystemContext;
+ field protected android.view.LayoutInflater! mSystemInflater;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ExpandedMenuView extends android.widget.ListView implements android.widget.AdapterView.OnItemClickListener androidx.appcompat.view.menu.MenuBuilder.ItemInvoker androidx.appcompat.view.menu.MenuView {
+ ctor public ExpandedMenuView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ExpandedMenuView(android.content.Context!, android.util.AttributeSet!, int);
+ method public int getWindowAnimations();
+ method public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+ method public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+ method public void onItemClick(android.widget.AdapterView!, android.view.View!, int, long);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ListMenuItemView extends android.widget.LinearLayout implements android.widget.AbsListView.SelectionBoundsAdjuster androidx.appcompat.view.menu.MenuView.ItemView {
+ ctor public ListMenuItemView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ListMenuItemView(android.content.Context!, android.util.AttributeSet!, int);
+ method public void adjustListItemSelectionBounds(android.graphics.Rect!);
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+ method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+ method public boolean prefersCondensedTitle();
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setForceShowIcon(boolean);
+ method public void setGroupDividerEnabled(boolean);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setShortcut(boolean, char);
+ method public void setTitle(CharSequence!);
+ method public boolean showsIcon();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ListMenuPresenter implements android.widget.AdapterView.OnItemClickListener androidx.appcompat.view.menu.MenuPresenter {
+ ctor public ListMenuPresenter(android.content.Context!, int);
+ ctor public ListMenuPresenter(int, int);
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean flagActionItems();
+ method public android.widget.ListAdapter! getAdapter();
+ method public int getId();
+ method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+ method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onItemClick(android.widget.AdapterView<?>!, android.view.View!, int, long);
+ method public void onRestoreInstanceState(android.os.Parcelable!);
+ method public android.os.Parcelable! onSaveInstanceState();
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void restoreHierarchyState(android.os.Bundle!);
+ method public void saveHierarchyState(android.os.Bundle!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setId(int);
+ method public void setItemIndexOffset(int);
+ method public void updateMenuView(boolean);
+ field public static final String VIEWS_TAG = "android:menu:list";
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuAdapter extends android.widget.BaseAdapter {
+ ctor public MenuAdapter(androidx.appcompat.view.menu.MenuBuilder!, android.view.LayoutInflater!, boolean, int);
+ method public androidx.appcompat.view.menu.MenuBuilder! getAdapterMenu();
+ method public int getCount();
+ method public boolean getForceShowIcon();
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItem(int);
+ method public long getItemId(int);
+ method public android.view.View! getView(int, android.view.View!, android.view.ViewGroup!);
+ method public void setForceShowIcon(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuBuilder implements androidx.core.internal.view.SupportMenu {
+ ctor public MenuBuilder(android.content.Context!);
+ method public android.view.MenuItem! add(CharSequence!);
+ method public android.view.MenuItem! add(int);
+ method public android.view.MenuItem! add(int, int, int, CharSequence!);
+ method public android.view.MenuItem! add(int, int, int, int);
+ method public int addIntentOptions(int, int, int, android.content.ComponentName!, android.content.Intent![]!, android.content.Intent!, int, android.view.MenuItem![]!);
+ method protected android.view.MenuItem! addInternal(int, int, int, CharSequence!);
+ method public void addMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!);
+ method public void addMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!, android.content.Context!);
+ method public android.view.SubMenu! addSubMenu(CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int);
+ method public android.view.SubMenu! addSubMenu(int, int, int, CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int, int, int, int);
+ method public void changeMenuMode();
+ method public void clear();
+ method public void clearAll();
+ method public void clearHeader();
+ method public final void close(boolean);
+ method public void close();
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuItemImpl!);
+ method public int findGroupIndex(int);
+ method public int findGroupIndex(int, int);
+ method public android.view.MenuItem! findItem(int);
+ method public int findItemIndex(int);
+ method public void flagActionItems();
+ method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!>! getActionItems();
+ method protected String! getActionViewStatesKey();
+ method public android.content.Context! getContext();
+ method public androidx.appcompat.view.menu.MenuItemImpl! getExpandedItem();
+ method public android.graphics.drawable.Drawable! getHeaderIcon();
+ method public CharSequence! getHeaderTitle();
+ method public android.view.View! getHeaderView();
+ method public android.view.MenuItem! getItem(int);
+ method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!>! getNonActionItems();
+ method public androidx.appcompat.view.menu.MenuBuilder! getRootMenu();
+ method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!> getVisibleItems();
+ method public boolean hasVisibleItems();
+ method public boolean isGroupDividerEnabled();
+ method public boolean isShortcutKey(int, android.view.KeyEvent!);
+ method public boolean isShortcutsVisible();
+ method public void onItemsChanged(boolean);
+ method public boolean performIdentifierAction(int, int);
+ method public boolean performItemAction(android.view.MenuItem!, int);
+ method public boolean performItemAction(android.view.MenuItem!, androidx.appcompat.view.menu.MenuPresenter!, int);
+ method public boolean performShortcut(int, android.view.KeyEvent!, int);
+ method public void removeGroup(int);
+ method public void removeItem(int);
+ method public void removeItemAt(int);
+ method public void removeMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!);
+ method public void restoreActionViewStates(android.os.Bundle!);
+ method public void restorePresenterStates(android.os.Bundle!);
+ method public void saveActionViewStates(android.os.Bundle!);
+ method public void savePresenterStates(android.os.Bundle!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setCurrentMenuInfo(android.view.ContextMenu.ContextMenuInfo!);
+ method public androidx.appcompat.view.menu.MenuBuilder! setDefaultShowAsAction(int);
+ method public void setGroupCheckable(int, boolean, boolean);
+ method public void setGroupEnabled(int, boolean);
+ method public void setGroupVisible(int, boolean);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderIconInt(android.graphics.drawable.Drawable!);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderIconInt(int);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderTitleInt(CharSequence!);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderTitleInt(int);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderViewInt(android.view.View!);
+ method public void setOptionalIconsVisible(boolean);
+ method public void setOverrideVisibleItems(boolean);
+ method public void setQwertyMode(boolean);
+ method public void setShortcutsVisible(boolean);
+ method public int size();
+ method public void startDispatchingItemsChanged();
+ method public void stopDispatchingItemsChanged();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface MenuBuilder.Callback {
+ method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface MenuBuilder.ItemInvoker {
+ method public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class MenuItemImpl implements androidx.core.internal.view.SupportMenuItem {
+ method public void actionFormatChanged();
+ method public boolean collapseActionView();
+ method public boolean expandActionView();
+ method public android.view.ActionProvider! getActionProvider();
+ method public android.view.View! getActionView();
+ method public char getAlphabeticShortcut();
+ method public int getGroupId();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public android.content.Intent! getIntent();
+ method @android.view.ViewDebug.CapturedViewProperty public int getItemId();
+ method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+ method public char getNumericShortcut();
+ method public int getOrder();
+ method public int getOrdering();
+ method public android.view.SubMenu! getSubMenu();
+ method public androidx.core.view.ActionProvider! getSupportActionProvider();
+ method @android.view.ViewDebug.CapturedViewProperty public CharSequence! getTitle();
+ method public CharSequence! getTitleCondensed();
+ method public boolean hasCollapsibleActionView();
+ method public boolean hasSubMenu();
+ method public boolean invoke();
+ method public boolean isActionButton();
+ method public boolean isActionViewExpanded();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public boolean isExclusiveCheckable();
+ method public boolean isVisible();
+ method public boolean requestsActionButton();
+ method public boolean requiresActionButton();
+ method public boolean requiresOverflow();
+ method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(android.view.View!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(int);
+ method public void setActionViewExpanded(boolean);
+ method public android.view.MenuItem! setAlphabeticShortcut(char);
+ method public android.view.MenuItem! setCallback(Runnable!);
+ method public android.view.MenuItem! setCheckable(boolean);
+ method public android.view.MenuItem! setChecked(boolean);
+ method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+ method public android.view.MenuItem! setEnabled(boolean);
+ method public void setExclusiveCheckable(boolean);
+ method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.MenuItem! setIcon(int);
+ method public android.view.MenuItem! setIntent(android.content.Intent!);
+ method public void setIsActionButton(boolean);
+ method public android.view.MenuItem! setNumericShortcut(char);
+ method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+ method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+ method public android.view.MenuItem! setShortcut(char, char);
+ method public void setShowAsAction(int);
+ method public androidx.core.internal.view.SupportMenuItem! setShowAsActionFlags(int);
+ method public void setSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+ method public android.view.MenuItem! setTitle(CharSequence!);
+ method public android.view.MenuItem! setTitle(int);
+ method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+ method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+ method public android.view.MenuItem! setVisible(boolean);
+ method public boolean shouldShowIcon();
+ method public boolean showsTextAsAction();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuItemWrapperICS implements android.view.MenuItem {
+ ctor public MenuItemWrapperICS(android.content.Context!, androidx.core.internal.view.SupportMenuItem!);
+ method public boolean collapseActionView();
+ method public boolean expandActionView();
+ method public android.view.ActionProvider! getActionProvider();
+ method public android.view.View! getActionView();
+ method public char getAlphabeticShortcut();
+ method public int getGroupId();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public android.content.Intent! getIntent();
+ method public int getItemId();
+ method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+ method public char getNumericShortcut();
+ method public int getOrder();
+ method public android.view.SubMenu! getSubMenu();
+ method public CharSequence! getTitle();
+ method public CharSequence! getTitleCondensed();
+ method public boolean hasSubMenu();
+ method public boolean isActionViewExpanded();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public boolean isVisible();
+ method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+ method public android.view.MenuItem! setActionView(android.view.View!);
+ method public android.view.MenuItem! setActionView(int);
+ method public android.view.MenuItem! setAlphabeticShortcut(char);
+ method public android.view.MenuItem! setCheckable(boolean);
+ method public android.view.MenuItem! setChecked(boolean);
+ method public android.view.MenuItem! setEnabled(boolean);
+ method public void setExclusiveCheckable(boolean);
+ method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.MenuItem! setIcon(int);
+ method public android.view.MenuItem! setIntent(android.content.Intent!);
+ method public android.view.MenuItem! setNumericShortcut(char);
+ method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+ method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+ method public android.view.MenuItem! setShortcut(char, char);
+ method public void setShowAsAction(int);
+ method public android.view.MenuItem! setShowAsActionFlags(int);
+ method public android.view.MenuItem! setTitle(CharSequence!);
+ method public android.view.MenuItem! setTitle(int);
+ method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+ method public android.view.MenuItem! setVisible(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuPopupHelper {
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder);
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View);
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View, boolean, @AttrRes int);
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View, boolean, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public int getGravity();
+ method public android.widget.ListView! getListView();
+ method public androidx.appcompat.view.menu.MenuPopup getPopup();
+ method public boolean isShowing();
+ method protected void onDismiss();
+ method public void setAnchorView(android.view.View);
+ method public void setForceShowIcon(boolean);
+ method public void setGravity(int);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setPresenterCallback(androidx.appcompat.view.menu.MenuPresenter.Callback?);
+ method public void show();
+ method public void show(int, int);
+ method public boolean tryShow();
+ method public boolean tryShow(int, int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuPresenter {
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean flagActionItems();
+ method public int getId();
+ method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+ method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onRestoreInstanceState(android.os.Parcelable!);
+ method public android.os.Parcelable! onSaveInstanceState();
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void updateMenuView(boolean);
+ }
+
+ public static interface MenuPresenter.Callback {
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder, boolean);
+ method public boolean onOpenSubMenu(androidx.appcompat.view.menu.MenuBuilder);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuView {
+ method public int getWindowAnimations();
+ method public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+ }
+
+ public static interface MenuView.ItemView {
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+ method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+ method public boolean prefersCondensedTitle();
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setEnabled(boolean);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setShortcut(boolean, char);
+ method public void setTitle(CharSequence!);
+ method public boolean showsIcon();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuWrapperICS implements android.view.Menu {
+ ctor public MenuWrapperICS(android.content.Context!, androidx.core.internal.view.SupportMenu!);
+ method public android.view.MenuItem! add(CharSequence!);
+ method public android.view.MenuItem! add(int);
+ method public android.view.MenuItem! add(int, int, int, CharSequence!);
+ method public android.view.MenuItem! add(int, int, int, int);
+ method public int addIntentOptions(int, int, int, android.content.ComponentName!, android.content.Intent![]!, android.content.Intent!, int, android.view.MenuItem![]!);
+ method public android.view.SubMenu! addSubMenu(CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int);
+ method public android.view.SubMenu! addSubMenu(int, int, int, CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int, int, int, int);
+ method public void clear();
+ method public void close();
+ method public android.view.MenuItem! findItem(int);
+ method public android.view.MenuItem! getItem(int);
+ method public boolean hasVisibleItems();
+ method public boolean isShortcutKey(int, android.view.KeyEvent!);
+ method public boolean performIdentifierAction(int, int);
+ method public boolean performShortcut(int, android.view.KeyEvent!, int);
+ method public void removeGroup(int);
+ method public void removeItem(int);
+ method public void setGroupCheckable(int, boolean, boolean);
+ method public void setGroupEnabled(int, boolean);
+ method public void setGroupVisible(int, boolean);
+ method public void setQwertyMode(boolean);
+ method public int size();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface ShowableListMenu {
+ method public void dismiss();
+ method public android.widget.ListView! getListView();
+ method public boolean isShowing();
+ method public void show();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SubMenuBuilder extends androidx.appcompat.view.menu.MenuBuilder implements android.view.SubMenu {
+ ctor public SubMenuBuilder(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public String! getActionViewStatesKey();
+ method public android.view.MenuItem! getItem();
+ method public android.view.Menu! getParentMenu();
+ method public boolean isQwertyMode();
+ method public android.view.SubMenu! setHeaderIcon(android.graphics.drawable.Drawable!);
+ method public android.view.SubMenu! setHeaderIcon(int);
+ method public android.view.SubMenu! setHeaderTitle(CharSequence!);
+ method public android.view.SubMenu! setHeaderTitle(int);
+ method public android.view.SubMenu! setHeaderView(android.view.View!);
+ method public android.view.SubMenu! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.SubMenu! setIcon(int);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarContainer extends android.widget.FrameLayout {
+ ctor public ActionBarContainer(android.content.Context!);
+ ctor public ActionBarContainer(android.content.Context!, android.util.AttributeSet!);
+ method public android.view.View! getTabContainer();
+ method public void onFinishInflate();
+ method public void onLayout(boolean, int, int, int, int);
+ method public void onMeasure(int, int);
+ method public void setPrimaryBackground(android.graphics.drawable.Drawable!);
+ method public void setSplitBackground(android.graphics.drawable.Drawable!);
+ method public void setStackedBackground(android.graphics.drawable.Drawable!);
+ method public void setTabContainer(androidx.appcompat.widget.ScrollingTabContainerView!);
+ method public void setTransitioning(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarContextView extends android.view.ViewGroup {
+ ctor public ActionBarContextView(android.content.Context);
+ ctor public ActionBarContextView(android.content.Context, android.util.AttributeSet?);
+ ctor public ActionBarContextView(android.content.Context, android.util.AttributeSet?, int);
+ method public void animateToVisibility(int);
+ method public boolean canShowOverflowMenu();
+ method public void closeMode();
+ method public void dismissPopupMenus();
+ method public int getAnimatedVisibility();
+ method public int getContentHeight();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public boolean hideOverflowMenu();
+ method public void initForMode(androidx.appcompat.view.ActionMode!);
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public boolean isOverflowReserved();
+ method public boolean isTitleOptional();
+ method public void killMode();
+ method public void onDetachedFromWindow();
+ method public void postShowOverflowMenu();
+ method public void setContentHeight(int);
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(CharSequence!);
+ method public void setTitleOptional(boolean);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarOverlayLayout extends android.view.ViewGroup implements androidx.appcompat.widget.DecorContentParent androidx.core.view.NestedScrollingParent androidx.core.view.NestedScrollingParent2 androidx.core.view.NestedScrollingParent3 {
+ ctor public ActionBarOverlayLayout(android.content.Context);
+ ctor public ActionBarOverlayLayout(android.content.Context, android.util.AttributeSet?);
+ method public boolean canShowOverflowMenu();
+ method public void dismissPopups();
+ method protected boolean fitSystemWindows(android.graphics.Rect!);
+ method protected androidx.appcompat.widget.ActionBarOverlayLayout.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionBarOverlayLayout.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method public int getActionBarHideOffset();
+ method public CharSequence! getTitle();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initFeature(int);
+ method public boolean isHideOnContentScrollEnabled();
+ method public boolean isInOverlayMode();
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public void onNestedPreScroll(android.view.View!, int, int, int[]!, int);
+ method public void onNestedScroll(android.view.View!, int, int, int, int, int, int[]!);
+ method public void onNestedScroll(android.view.View!, int, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View!, android.view.View!, int, int);
+ method public boolean onStartNestedScroll(android.view.View!, android.view.View!, int, int);
+ method public void onStopNestedScroll(android.view.View!, int);
+ method public void restoreToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setActionBarHideOffset(int);
+ method public void setActionBarVisibilityCallback(androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback!);
+ method public void setHasNonEmbeddedTabs(boolean);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuPrepared();
+ method public void setOverlayMode(boolean);
+ method public void setShowingForActionMode(boolean);
+ method public void setUiOptions(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public boolean showOverflowMenu();
+ }
+
+ public static interface ActionBarOverlayLayout.ActionBarVisibilityCallback {
+ method public void enableContentAnimations(boolean);
+ method public void hideForSystem();
+ method public void onContentScrollStarted();
+ method public void onContentScrollStopped();
+ method public void onWindowVisibilityChanged(int);
+ method public void showForSystem();
+ }
+
+ public static class ActionBarOverlayLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBarOverlayLayout.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionBarOverlayLayout.LayoutParams(int, int);
+ ctor public ActionBarOverlayLayout.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionBarOverlayLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ }
+
+ public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.menu.MenuBuilder.ItemInvoker androidx.appcompat.view.menu.MenuView {
+ ctor public ActionMenuView(android.content.Context);
+ ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateOverflowButtonLayoutParams();
+ method public android.view.Menu! getMenu();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getWindowAnimations();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected boolean hasSupportDividerBeforeChildAt(int);
+ method public boolean hideOverflowMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowReserved();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDetachedFromWindow();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.view.menu.MenuBuilder! peekMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setExpandedActionViewsExclusive(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOverflowReserved(boolean);
+ method public void setPopupTheme(@StyleRes int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setPresenter(androidx.appcompat.widget.ActionMenuPresenter!);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionMenuView.ActionMenuChildView {
+ method public boolean needsDividerAfter();
+ method public boolean needsDividerBefore();
+ }
+
+ public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+ ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(int, int);
+ field @android.view.ViewDebug.ExportedProperty public int cellsUsed;
+ field @android.view.ViewDebug.ExportedProperty public boolean expandable;
+ field @android.view.ViewDebug.ExportedProperty public int extraPixels;
+ field @android.view.ViewDebug.ExportedProperty public boolean isOverflowButton;
+ field @android.view.ViewDebug.ExportedProperty public boolean preventEdgeOffset;
+ }
+
+ public static interface ActionMenuView.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActivityChooserView extends android.view.ViewGroup {
+ ctor public ActivityChooserView(android.content.Context);
+ ctor public ActivityChooserView(android.content.Context, android.util.AttributeSet?);
+ ctor public ActivityChooserView(android.content.Context, android.util.AttributeSet?, int);
+ method public boolean dismissPopup();
+ method public androidx.appcompat.widget.ActivityChooserModel! getDataModel();
+ method public boolean isShowingPopup();
+ method public void setActivityChooserModel(androidx.appcompat.widget.ActivityChooserModel!);
+ method public void setDefaultActionButtonContentDescription(int);
+ method public void setExpandActivityOverflowButtonContentDescription(int);
+ method public void setExpandActivityOverflowButtonDrawable(android.graphics.drawable.Drawable!);
+ method public void setInitialActivityCount(int);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setProvider(androidx.core.view.ActionProvider!);
+ method public boolean showPopup();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ActivityChooserView.InnerLayout extends android.widget.LinearLayout {
+ ctor public ActivityChooserView.InnerLayout(android.content.Context!, android.util.AttributeSet!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AlertDialogLayout extends androidx.appcompat.widget.LinearLayoutCompat {
+ ctor public AlertDialogLayout(android.content.Context?);
+ ctor public AlertDialogLayout(android.content.Context?, android.util.AttributeSet?);
+ }
+
+ public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatButton(android.content.Context);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setSupportAllCaps(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatCheckBox(android.content.Context);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatCheckedTextView extends android.widget.CheckedTextView {
+ ctor public AppCompatCheckedTextView(android.content.Context);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class AppCompatDrawableManager {
+ ctor public AppCompatDrawableManager();
+ method public static androidx.appcompat.widget.AppCompatDrawableManager! get();
+ method public android.graphics.drawable.Drawable! getDrawable(android.content.Context, @DrawableRes int);
+ method public static android.graphics.PorterDuffColorFilter! getPorterDuffColorFilter(int, android.graphics.PorterDuff.Mode!);
+ method public void onConfigurationChanged(android.content.Context);
+ method public static void preload();
+ }
+
+ public class AppCompatEditText extends android.widget.EditText implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatEditText(android.content.Context);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+ ctor public AppCompatImageButton(android.content.Context);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AppCompatImageHelper {
+ ctor public AppCompatImageHelper(android.widget.ImageView);
+ method public void loadFromAttributes(android.util.AttributeSet!, int);
+ method public void setImageResource(int);
+ }
+
+ public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+ ctor public AppCompatImageView(android.content.Context);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatRadioButton(android.content.Context!);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatRatingBar extends android.widget.RatingBar {
+ ctor public AppCompatRatingBar(android.content.Context);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSeekBar extends android.widget.SeekBar {
+ ctor public AppCompatSeekBar(android.content.Context);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatSpinner(android.content.Context);
+ ctor public AppCompatSpinner(android.content.Context, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatTextView(android.content.Context);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+ method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+ }
+
+ public class AppCompatToggleButton extends android.widget.ToggleButton {
+ ctor public AppCompatToggleButton(android.content.Context);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ButtonBarLayout extends android.widget.LinearLayout {
+ ctor public ButtonBarLayout(android.content.Context, android.util.AttributeSet?);
+ method public void setAllowStacking(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DecorContentParent {
+ method public boolean canShowOverflowMenu();
+ method public void dismissPopups();
+ method public CharSequence! getTitle();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initFeature(int);
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public void restoreToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuPrepared();
+ method public void setUiOptions(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DecorToolbar {
+ method public void animateToVisibility(int);
+ method public boolean canShowOverflowMenu();
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method public android.content.Context! getContext();
+ method public android.view.View! getCustomView();
+ method public int getDisplayOptions();
+ method public int getDropdownItemCount();
+ method public int getDropdownSelectedPosition();
+ method public int getHeight();
+ method public android.view.Menu! getMenu();
+ method public int getNavigationMode();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public android.view.ViewGroup! getViewGroup();
+ method public int getVisibility();
+ method public boolean hasEmbeddedTabs();
+ method public boolean hasExpandedActionView();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initIndeterminateProgress();
+ method public void initProgress();
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public boolean isTitleTruncated();
+ method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setCollapsible(boolean);
+ method public void setCustomView(android.view.View!);
+ method public void setDefaultNavigationContentDescription(int);
+ method public void setDefaultNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setDisplayOptions(int);
+ method public void setDropdownParams(android.widget.SpinnerAdapter!, android.widget.AdapterView.OnItemSelectedListener!);
+ method public void setDropdownSelectedPosition(int);
+ method public void setEmbeddedTabView(androidx.appcompat.widget.ScrollingTabContainerView!);
+ method public void setHomeButtonEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setMenuPrepared();
+ method public void setNavigationContentDescription(CharSequence!);
+ method public void setNavigationContentDescription(int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setNavigationIcon(int);
+ method public void setNavigationMode(int);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(CharSequence!);
+ method public void setVisibility(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DialogTitle extends androidx.appcompat.widget.AppCompatTextView {
+ ctor public DialogTitle(android.content.Context, android.util.AttributeSet?, int);
+ ctor public DialogTitle(android.content.Context, android.util.AttributeSet?);
+ ctor public DialogTitle(android.content.Context);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsFrameLayout extends android.widget.FrameLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
+ ctor public FitWindowsFrameLayout(android.content.Context);
+ ctor public FitWindowsFrameLayout(android.content.Context, android.util.AttributeSet?);
+ method protected boolean fitSystemWindows(android.graphics.Rect!);
+ method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsLinearLayout extends android.widget.LinearLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
+ ctor public FitWindowsLinearLayout(android.content.Context);
+ ctor public FitWindowsLinearLayout(android.content.Context, android.util.AttributeSet?);
+ method protected boolean fitSystemWindows(android.graphics.Rect!);
+ method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface FitWindowsViewGroup {
+ method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+ }
+
+ public static interface FitWindowsViewGroup.OnFitSystemWindowsListener {
+ method public void onFitSystemWindows(android.graphics.Rect!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ForwardingListener implements android.view.View.OnAttachStateChangeListener android.view.View.OnTouchListener {
+ ctor public ForwardingListener(android.view.View!);
+ method public abstract androidx.appcompat.view.menu.ShowableListMenu! getPopup();
+ method protected boolean onForwardingStarted();
+ method protected boolean onForwardingStopped();
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ method public void onViewAttachedToWindow(android.view.View!);
+ method public void onViewDetachedFromWindow(android.view.View!);
+ }
+
+ public class LinearLayoutCompat extends android.view.ViewGroup {
+ ctor public LinearLayoutCompat(android.content.Context);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public int getBaselineAlignedChildIndex();
+ method public android.graphics.drawable.Drawable! getDividerDrawable();
+ method public int getDividerPadding();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getDividerWidth();
+ method public int getGravity();
+ method @androidx.appcompat.widget.LinearLayoutCompat.OrientationMode public int getOrientation();
+ method @androidx.appcompat.widget.LinearLayoutCompat.DividerMode public int getShowDividers();
+ method public float getWeightSum();
+ method public boolean isBaselineAligned();
+ method public boolean isMeasureWithLargestChildEnabled();
+ method public void setBaselineAligned(boolean);
+ method public void setBaselineAlignedChildIndex(int);
+ method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+ method public void setDividerPadding(int);
+ method public void setGravity(int);
+ method public void setHorizontalGravity(int);
+ method public void setMeasureWithLargestChildEnabled(boolean);
+ method public void setOrientation(@androidx.appcompat.widget.LinearLayoutCompat.OrientationMode int);
+ method public void setShowDividers(@androidx.appcompat.widget.LinearLayoutCompat.DividerMode int);
+ method public void setVerticalGravity(int);
+ method public void setWeightSum(float);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+ field public static final int SHOW_DIVIDER_END = 4; // 0x4
+ field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+ field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ @IntDef(flag=true, value={androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_NONE, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_BEGINNING, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_MIDDLE, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinearLayoutCompat.DividerMode {
+ }
+
+ public static class LinearLayoutCompat.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public LinearLayoutCompat.LayoutParams(int, int);
+ ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(androidx.appcompat.widget.LinearLayoutCompat.LayoutParams!);
+ field public int gravity;
+ field public float weight;
+ }
+
+ @IntDef({androidx.appcompat.widget.LinearLayoutCompat.HORIZONTAL, androidx.appcompat.widget.LinearLayoutCompat.VERTICAL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinearLayoutCompat.OrientationMode {
+ }
+
+ public class ListPopupWindow implements androidx.appcompat.view.menu.ShowableListMenu {
+ ctor public ListPopupWindow(android.content.Context);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+ method public void clearListSelection();
+ method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+ method public void dismiss();
+ method public android.view.View? getAnchorView();
+ method @StyleRes public int getAnimationStyle();
+ method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
+ method public int getHeight();
+ method public int getHorizontalOffset();
+ method public int getInputMethodMode();
+ method public android.widget.ListView? getListView();
+ method public int getPromptPosition();
+ method public Object? getSelectedItem();
+ method public long getSelectedItemId();
+ method public int getSelectedItemPosition();
+ method public android.view.View? getSelectedView();
+ method public int getSoftInputMode();
+ method public int getVerticalOffset();
+ method public int getWidth();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isDropDownAlwaysVisible();
+ method public boolean isInputMethodNotNeeded();
+ method public boolean isModal();
+ method public boolean isShowing();
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyPreIme(int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public boolean performItemClick(int);
+ method public void postShow();
+ method public void setAdapter(android.widget.ListAdapter?);
+ method public void setAnchorView(android.view.View?);
+ method public void setAnimationStyle(@StyleRes int);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setContentWidth(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setDropDownAlwaysVisible(boolean);
+ method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setForceIgnoreOutsideTouch(boolean);
+ method public void setHeight(int);
+ method public void setHorizontalOffset(int);
+ method public void setInputMethodMode(int);
+ method public void setListSelector(android.graphics.drawable.Drawable!);
+ method public void setModal(boolean);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+ method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOverlapAnchor(boolean);
+ method public void setPromptPosition(int);
+ method public void setPromptView(android.view.View?);
+ method public void setSelection(int);
+ method public void setSoftInputMode(int);
+ method public void setVerticalOffset(int);
+ method public void setWidth(int);
+ method public void setWindowLayoutType(int);
+ method public void show();
+ field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+ field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+ field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+ field public static final int MATCH_PARENT = -1; // 0xffffffff
+ field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+ field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+ field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuItemHoverListener {
+ method public void onItemHoverEnter(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onItemHoverExit(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuPopupWindow extends androidx.appcompat.widget.ListPopupWindow implements androidx.appcompat.widget.MenuItemHoverListener {
+ ctor public MenuPopupWindow(android.content.Context, android.util.AttributeSet?, int, int);
+ method public void onItemHoverEnter(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onItemHoverExit(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void setEnterTransition(Object!);
+ method public void setExitTransition(Object!);
+ method public void setHoverListener(androidx.appcompat.widget.MenuItemHoverListener!);
+ method public void setTouchModal(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class MenuPopupWindow.MenuDropDownListView extends android.widget.ListView {
+ ctor public MenuPopupWindow.MenuDropDownListView(android.content.Context!, boolean);
+ method public void clearSelection();
+ method public int lookForSelectablePosition(int, boolean);
+ method public int measureHeightOfChildrenCompat(int, int, int, int, int);
+ method public boolean onForwardedEvent(android.view.MotionEvent!, int);
+ method public void setHoverListener(androidx.appcompat.widget.MenuItemHoverListener!);
+ field public static final int INVALID_POSITION = -1; // 0xffffffff
+ field public static final int NO_POSITION = -1; // 0xffffffff
+ }
+
+ public class PopupMenu {
+ ctor public PopupMenu(android.content.Context, android.view.View);
+ ctor public PopupMenu(android.content.Context, android.view.View, int);
+ ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public android.view.View.OnTouchListener getDragToOpenListener();
+ method public int getGravity();
+ method public android.view.Menu getMenu();
+ method public android.view.MenuInflater getMenuInflater();
+ method public void inflate(@MenuRes int);
+ method public void setGravity(int);
+ method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+ method public void show();
+ }
+
+ public static interface PopupMenu.OnDismissListener {
+ method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+ }
+
+ public static interface PopupMenu.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ScrollingTabContainerView extends android.widget.HorizontalScrollView implements android.widget.AdapterView.OnItemSelectedListener {
+ ctor public ScrollingTabContainerView(android.content.Context);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public void animateToTab(int);
+ method public void animateToVisibility(int);
+ method public void onAttachedToWindow();
+ method public void onDetachedFromWindow();
+ method public void onItemSelected(android.widget.AdapterView<?>!, android.view.View!, int, long);
+ method public void onMeasure(int, int);
+ method public void onNothingSelected(android.widget.AdapterView<?>!);
+ method public void removeAllTabs();
+ method public void removeTabAt(int);
+ method public void setAllowCollapse(boolean);
+ method public void setContentHeight(int);
+ method public void setTabSelected(int);
+ method public void updateTab(int);
+ field protected final androidx.appcompat.widget.ScrollingTabContainerView.VisibilityAnimListener! mVisAnimListener;
+ field protected android.view.ViewPropertyAnimator! mVisibilityAnim;
+ }
+
+ protected class ScrollingTabContainerView.VisibilityAnimListener extends android.animation.AnimatorListenerAdapter {
+ ctor protected ScrollingTabContainerView.VisibilityAnimListener();
+ method public androidx.appcompat.widget.ScrollingTabContainerView.VisibilityAnimListener! withFinalVisibility(android.view.ViewPropertyAnimator!, int);
+ }
+
+ public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+ ctor public SearchView(android.content.Context);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+ method public int getImeOptions();
+ method public int getInputType();
+ method public int getMaxWidth();
+ method public CharSequence! getQuery();
+ method public CharSequence? getQueryHint();
+ method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+ method public boolean isIconfiedByDefault();
+ method public boolean isIconified();
+ method public boolean isQueryRefinementEnabled();
+ method public boolean isSubmitButtonEnabled();
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAppSearchData(android.os.Bundle!);
+ method public void setIconified(boolean);
+ method public void setIconifiedByDefault(boolean);
+ method public void setImeOptions(int);
+ method public void setInputType(int);
+ method public void setMaxWidth(int);
+ method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+ method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+ method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+ method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+ method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+ method public void setQuery(CharSequence!, boolean);
+ method public void setQueryHint(CharSequence?);
+ method public void setQueryRefinementEnabled(boolean);
+ method public void setSearchableInfo(android.app.SearchableInfo!);
+ method public void setSubmitButtonEnabled(boolean);
+ method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+ }
+
+ public static interface SearchView.OnCloseListener {
+ method public boolean onClose();
+ }
+
+ public static interface SearchView.OnQueryTextListener {
+ method public boolean onQueryTextChange(String!);
+ method public boolean onQueryTextSubmit(String!);
+ }
+
+ public static interface SearchView.OnSuggestionListener {
+ method public boolean onSuggestionClick(int);
+ method public boolean onSuggestionSelect(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class SearchView.SearchAutoComplete extends androidx.appcompat.widget.AppCompatAutoCompleteTextView {
+ ctor public SearchView.SearchAutoComplete(android.content.Context!);
+ ctor public SearchView.SearchAutoComplete(android.content.Context!, android.util.AttributeSet!);
+ ctor public SearchView.SearchAutoComplete(android.content.Context!, android.util.AttributeSet!, int);
+ }
+
+ public class ShareActionProvider extends androidx.core.view.ActionProvider {
+ ctor public ShareActionProvider(android.content.Context!);
+ method public android.view.View! onCreateActionView();
+ method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+ method public void setShareHistoryFileName(String!);
+ method public void setShareIntent(android.content.Intent!);
+ field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ }
+
+ public static interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+ }
+
+ public class SwitchCompat extends android.widget.CompoundButton {
+ ctor public SwitchCompat(android.content.Context);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+ method public boolean getShowText();
+ method public boolean getSplitTrack();
+ method public int getSwitchMinWidth();
+ method public int getSwitchPadding();
+ method public CharSequence! getTextOff();
+ method public CharSequence! getTextOn();
+ method public android.graphics.drawable.Drawable! getThumbDrawable();
+ method public int getThumbTextPadding();
+ method public android.content.res.ColorStateList? getThumbTintList();
+ method public android.graphics.PorterDuff.Mode? getThumbTintMode();
+ method public android.graphics.drawable.Drawable! getTrackDrawable();
+ method public android.content.res.ColorStateList? getTrackTintList();
+ method public android.graphics.PorterDuff.Mode? getTrackTintMode();
+ method public void onMeasure(int, int);
+ method public void setShowText(boolean);
+ method public void setSplitTrack(boolean);
+ method public void setSwitchMinWidth(int);
+ method public void setSwitchPadding(int);
+ method public void setSwitchTextAppearance(android.content.Context!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!);
+ method public void setTextOff(CharSequence!);
+ method public void setTextOn(CharSequence!);
+ method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+ method public void setThumbResource(int);
+ method public void setThumbTextPadding(int);
+ method public void setThumbTintList(android.content.res.ColorStateList?);
+ method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+ method public void setTrackResource(int);
+ method public void setTrackTintList(android.content.res.ColorStateList?);
+ method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public static final class ThemedSpinnerAdapter.Helper {
+ ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+ method public android.view.LayoutInflater getDropDownViewInflater();
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintTypedArray {
+ method public boolean getBoolean(int, boolean);
+ method @RequiresApi(21) public int getChangingConfigurations();
+ method public int getColor(int, int);
+ method public android.content.res.ColorStateList! getColorStateList(int);
+ method public float getDimension(int, float);
+ method public int getDimensionPixelOffset(int, int);
+ method public int getDimensionPixelSize(int, int);
+ method public android.graphics.drawable.Drawable! getDrawable(int);
+ method public android.graphics.drawable.Drawable! getDrawableIfKnown(int);
+ method public float getFloat(int, float);
+ method public android.graphics.Typeface? getFont(@StyleableRes int, int, androidx.core.content.res.ResourcesCompat.FontCallback?);
+ method public float getFraction(int, int, int, float);
+ method public int getIndex(int);
+ method public int getIndexCount();
+ method public int getInt(int, int);
+ method public int getInteger(int, int);
+ method public int getLayoutDimension(int, String!);
+ method public int getLayoutDimension(int, int);
+ method public String! getNonResourceString(int);
+ method public String! getPositionDescription();
+ method public int getResourceId(int, int);
+ method public android.content.res.Resources! getResources();
+ method public String! getString(int);
+ method public CharSequence! getText(int);
+ method public CharSequence![]! getTextArray(int);
+ method public int getType(int);
+ method public boolean getValue(int, android.util.TypedValue!);
+ method public android.content.res.TypedArray! getWrappedTypeArray();
+ method public boolean hasValue(int);
+ method public int length();
+ method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, android.util.AttributeSet!, int[]!);
+ method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, android.util.AttributeSet!, int[]!, int, int);
+ method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, int, int[]!);
+ method public android.util.TypedValue! peekValue(int);
+ method public void recycle();
+ }
+
+ public class Toolbar extends android.view.ViewGroup {
+ ctor public Toolbar(android.content.Context);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean canShowOverflowMenu();
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public CharSequence? getCollapseContentDescription();
+ method public android.graphics.drawable.Drawable? getCollapseIcon();
+ method public int getContentInsetEnd();
+ method public int getContentInsetEndWithActions();
+ method public int getContentInsetLeft();
+ method public int getContentInsetRight();
+ method public int getContentInsetStart();
+ method public int getContentInsetStartWithNavigation();
+ method public int getCurrentContentInsetEnd();
+ method public int getCurrentContentInsetLeft();
+ method public int getCurrentContentInsetRight();
+ method public int getCurrentContentInsetStart();
+ method public android.graphics.drawable.Drawable! getLogo();
+ method public CharSequence! getLogoDescription();
+ method public android.view.Menu! getMenu();
+ method public CharSequence? getNavigationContentDescription();
+ method public android.graphics.drawable.Drawable? getNavigationIcon();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public int getTitleMarginBottom();
+ method public int getTitleMarginEnd();
+ method public int getTitleMarginStart();
+ method public int getTitleMarginTop();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.DecorToolbar! getWrapper();
+ method public boolean hasExpandedActionView();
+ method public boolean hideOverflowMenu();
+ method public void inflateMenu(@MenuRes int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+ method public void setCollapseContentDescription(@StringRes int);
+ method public void setCollapseContentDescription(CharSequence?);
+ method public void setCollapseIcon(@DrawableRes int);
+ method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setCollapsible(boolean);
+ method public void setContentInsetEndWithActions(int);
+ method public void setContentInsetStartWithNavigation(int);
+ method public void setContentInsetsAbsolute(int, int);
+ method public void setContentInsetsRelative(int, int);
+ method public void setLogo(@DrawableRes int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setLogoDescription(@StringRes int);
+ method public void setLogoDescription(CharSequence!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenu(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.widget.ActionMenuPresenter!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setNavigationContentDescription(@StringRes int);
+ method public void setNavigationContentDescription(CharSequence?);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+ method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setSubtitleTextColor(@ColorInt int);
+ method public void setSubtitleTextColor(android.content.res.ColorStateList);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence!);
+ method public void setTitleMargin(int, int, int, int);
+ method public void setTitleMarginBottom(int);
+ method public void setTitleMarginEnd(int);
+ method public void setTitleMarginStart(int);
+ method public void setTitleMarginTop(int);
+ method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setTitleTextColor(@ColorInt int);
+ method public void setTitleTextColor(android.content.res.ColorStateList);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+ ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public Toolbar.LayoutParams(int, int);
+ ctor public Toolbar.LayoutParams(int, int, int);
+ ctor public Toolbar.LayoutParams(int);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ }
+
+ public static interface Toolbar.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+ ctor public Toolbar.SavedState(android.os.Parcel!);
+ ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+ ctor public Toolbar.SavedState(android.os.Parcelable!);
+ field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ToolbarWidgetWrapper implements androidx.appcompat.widget.DecorToolbar {
+ ctor public ToolbarWidgetWrapper(androidx.appcompat.widget.Toolbar!, boolean);
+ ctor public ToolbarWidgetWrapper(androidx.appcompat.widget.Toolbar!, boolean, int, int);
+ method public void animateToVisibility(int);
+ method public boolean canShowOverflowMenu();
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method public android.content.Context! getContext();
+ method public android.view.View! getCustomView();
+ method public int getDisplayOptions();
+ method public int getDropdownItemCount();
+ method public int getDropdownSelectedPosition();
+ method public int getHeight();
+ method public android.view.Menu! getMenu();
+ method public int getNavigationMode();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public android.view.ViewGroup! getViewGroup();
+ method public int getVisibility();
+ method public boolean hasEmbeddedTabs();
+ method public boolean hasExpandedActionView();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initIndeterminateProgress();
+ method public void initProgress();
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public boolean isTitleTruncated();
+ method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setCollapsible(boolean);
+ method public void setCustomView(android.view.View!);
+ method public void setDefaultNavigationContentDescription(int);
+ method public void setDefaultNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setDisplayOptions(int);
+ method public void setDropdownParams(android.widget.SpinnerAdapter!, android.widget.AdapterView.OnItemSelectedListener!);
+ method public void setDropdownSelectedPosition(int);
+ method public void setEmbeddedTabView(androidx.appcompat.widget.ScrollingTabContainerView!);
+ method public void setHomeButtonEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setMenuPrepared();
+ method public void setNavigationContentDescription(CharSequence!);
+ method public void setNavigationContentDescription(int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setNavigationIcon(int);
+ method public void setNavigationMode(int);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(CharSequence!);
+ method public void setVisibility(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+ method public boolean showOverflowMenu();
+ }
+
+ public class TooltipCompat {
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ViewStubCompat extends android.view.View {
+ ctor public ViewStubCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public ViewStubCompat(android.content.Context, android.util.AttributeSet?, int);
+ method public int getInflatedId();
+ method public android.view.LayoutInflater! getLayoutInflater();
+ method public int getLayoutResource();
+ method public android.view.View! inflate();
+ method public void setInflatedId(int);
+ method public void setLayoutInflater(android.view.LayoutInflater!);
+ method public void setLayoutResource(int);
+ method public void setOnInflateListener(androidx.appcompat.widget.ViewStubCompat.OnInflateListener!);
+ }
+
+ public static interface ViewStubCompat.OnInflateListener {
+ method public void onInflate(androidx.appcompat.widget.ViewStubCompat!, android.view.View!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewUtils {
+ method public static void computeFitSystemWindows(android.view.View!, android.graphics.Rect!, android.graphics.Rect!);
+ method public static boolean isLayoutRtl(android.view.View!);
+ method public static void makeOptionalFitsSystemWindows(android.view.View!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WithHint {
+ method public CharSequence? getHint();
+ }
+
+}
+
diff --git a/appcompat/appcompat/build.gradle b/appcompat/appcompat/build.gradle
index 687a5f4..6173edf 100644
--- a/appcompat/appcompat/build.gradle
+++ b/appcompat/appcompat/build.gradle
@@ -12,12 +12,15 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
- api("androidx.core:core:1.3.0-rc01")
+ api(project(":core:core"))
implementation("androidx.collection:collection:1.0.0")
api("androidx.cursoradapter:cursoradapter:1.0.0")
api("androidx.fragment:fragment:1.1.0")
api(project(":appcompat:appcompat-resources"))
api("androidx.drawerlayout:drawerlayout:1.0.0")
+ implementation(project(":lifecycle:lifecycle-runtime"))
+ implementation(project(":lifecycle:lifecycle-viewmodel"))
+ implementation(project(":savedstate:savedstate"))
androidTestImplementation(KOTLIN_STDLIB)
androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatActivityViewTreeTest.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatActivityViewTreeTest.kt
new file mode 100644
index 0000000..82497d0
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/app/AppCompatActivityViewTreeTest.kt
@@ -0,0 +1,54 @@
+/*
+ * 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.appcompat.app
+
+import androidx.lifecycle.ViewTreeLifecycleOwner
+import androidx.lifecycle.ViewTreeViewModelStoreOwner
+import androidx.savedstate.ViewTreeSavedStateRegistryOwner
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.rule.ActivityTestRule
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class AppCompatActivityViewTreeTest {
+ @get:Rule
+ val activityRule = ActivityTestRule<AppCompatInflaterDefaultActivity>(
+ AppCompatInflaterDefaultActivity::class.java)
+
+ @Test
+ fun queryViewTreeLifecycleTest() {
+ val lfOwner = ViewTreeLifecycleOwner.get(activityRule.activity.window.decorView)
+ assertThat(lfOwner).isEqualTo(activityRule.activity)
+ }
+
+ @Test
+ fun queryViewTreeViewModelStoreTest() {
+ val vmsOwner = ViewTreeViewModelStoreOwner.get(activityRule.activity.window.decorView)
+ assertThat(vmsOwner).isEqualTo(activityRule.activity)
+ }
+
+ @Test
+ fun queryViewTreeSavedStateRegistryTest() {
+ val ssrOwner = ViewTreeSavedStateRegistryOwner.get(activityRule.activity.window.decorView)
+ assertThat(ssrOwner).isEqualTo(activityRule.activity)
+ }
+}
\ No newline at end of file
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
index 9ee80bd..664d69f 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/app/AppCompatActivity.java
@@ -45,6 +45,9 @@
import androidx.core.app.NavUtils;
import androidx.core.app.TaskStackBuilder;
import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.ViewTreeLifecycleOwner;
+import androidx.lifecycle.ViewTreeViewModelStoreOwner;
+import androidx.savedstate.ViewTreeSavedStateRegistryOwner;
/**
* Base class for activities that wish to use some of the newer platform features on older
@@ -167,24 +170,36 @@
@Override
public void setContentView(@LayoutRes int layoutResID) {
+ initViewTreeOwners();
getDelegate().setContentView(layoutResID);
}
@Override
public void setContentView(View view) {
+ initViewTreeOwners();
getDelegate().setContentView(view);
}
@Override
public void setContentView(View view, ViewGroup.LayoutParams params) {
+ initViewTreeOwners();
getDelegate().setContentView(view, params);
}
@Override
public void addContentView(View view, ViewGroup.LayoutParams params) {
+ initViewTreeOwners();
getDelegate().addContentView(view, params);
}
+ private void initViewTreeOwners() {
+ // Set the view tree owners before setting the content view so that the inflation process
+ // and attach listeners will see them already present
+ ViewTreeLifecycleOwner.set(getWindow().getDecorView(), this);
+ ViewTreeViewModelStoreOwner.set(getWindow().getDecorView(), this);
+ ViewTreeSavedStateRegistryOwner.set(getWindow().getDecorView(), this);
+ }
+
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
diff --git a/appcompat/appcompat/src/main/res/layout/abc_action_mode_close_item_material.xml b/appcompat/appcompat/src/main/res/layout/abc_action_mode_close_item_material.xml
index 118ce2b..e3086e4 100644
--- a/appcompat/appcompat/src/main/res/layout/abc_action_mode_close_item_material.xml
+++ b/appcompat/appcompat/src/main/res/layout/abc_action_mode_close_item_material.xml
@@ -25,6 +25,6 @@
android:clickable="true"
android:contentDescription="@string/abc_action_mode_done"
android:focusable="true"
- android:paddingLeft="8dp"
- android:paddingStart="8dp"
+ android:paddingLeft="12dp"
+ android:paddingStart="12dp"
app:srcCompat="?attr/actionModeCloseDrawable" />
\ No newline at end of file
diff --git a/appcompat/appcompat/src/main/res/values/styles_base.xml b/appcompat/appcompat/src/main/res/values/styles_base.xml
index 812caf9..4fd5211 100644
--- a/appcompat/appcompat/src/main/res/values/styles_base.xml
+++ b/appcompat/appcompat/src/main/res/values/styles_base.xml
@@ -135,6 +135,17 @@
<item name="titleTextStyle">@style/TextAppearance.AppCompat.Widget.ActionMode.Title</item>
<item name="subtitleTextStyle">@style/TextAppearance.AppCompat.Widget.ActionMode.Subtitle</item>
<item name="closeItemLayout">@layout/abc_action_mode_close_item_material</item>
+
+ <item name="android:minHeight">?attr/actionBarSize</item>
+ <item name="titleMargin">4dp</item>
+ <item name="maxButtonHeight">@dimen/abc_action_bar_default_height_material</item>
+ <item name="buttonGravity">top</item>
+ <item name="contentInsetStart">16dp</item>
+ <item name="contentInsetStartWithNavigation">@dimen/abc_action_bar_content_inset_with_nav</item>
+ <item name="android:paddingLeft">@dimen/abc_action_bar_default_padding_start_material</item>
+ <item name="android:paddingStart">@dimen/abc_action_bar_default_padding_start_material</item>
+ <item name="android:paddingRight">@dimen/abc_action_bar_default_padding_end_material</item>
+ <item name="android:paddingEnd">@dimen/abc_action_bar_default_padding_end_material</item>
</style>
<style name="Base.TextAppearance.AppCompat.Widget.ActionMode.Title" parent="TextAppearance.AppCompat.Widget.ActionBar.Title"/>
@@ -312,7 +323,9 @@
<item name="contentInsetStart">16dp</item>
<item name="contentInsetStartWithNavigation">@dimen/abc_action_bar_content_inset_with_nav</item>
<item name="android:paddingLeft">@dimen/abc_action_bar_default_padding_start_material</item>
+ <item name="android:paddingStart">@dimen/abc_action_bar_default_padding_start_material</item>
<item name="android:paddingRight">@dimen/abc_action_bar_default_padding_end_material</item>
+ <item name="android:paddingEnd">@dimen/abc_action_bar_default_padding_end_material</item>
</style>
<style name="Base.Widget.AppCompat.Toolbar.Button.Navigation" parent="android:Widget">
diff --git a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
index 3755907..45d1c65 100644
--- a/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -24,7 +24,7 @@
val ADS_IDENTIFIER = Version("1.0.0-alpha04")
val ANNOTATION = Version("1.2.0-alpha01")
val ANNOTATION_EXPERIMENTAL = Version("1.1.0-alpha01")
- val APPCOMPAT = Version("1.2.0-rc01")
+ val APPCOMPAT = Version("1.3.0-alpha01")
val APPSEARCH = Version("1.0.0-alpha01")
val ARCH_CORE = Version("2.2.0-alpha01")
val ARCH_CORE_TESTING = ARCH_CORE
@@ -106,7 +106,7 @@
val TESTSCREENSHOT = Version("1.0.0-alpha01")
val TEXTCLASSIFIER = Version("1.0.0-alpha03")
val TRACING = Version("1.0.0-alpha01")
- val TRANSITION = Version("2.0.0-alpha01")
+ val TRANSITION = Version("1.4.0-alpha01")
val TVPROVIDER = Version("1.1.0-alpha01")
val UI = Version("0.1.0-dev11")
val VECTORDRAWABLE = Version("1.2.0-alpha01")
diff --git a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
index ce523e4..f09db43 100644
--- a/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/PublishDocsRules.kt
@@ -111,6 +111,7 @@
ignore(LibraryGroups.RECYCLERVIEW.group, "recyclerview-lint")
prebuilts(LibraryGroups.REMOTECALLBACK, "1.0.0-alpha02")
prebuilts(LibraryGroups.ROOM, "2.2.4")
+ ignore(LibraryGroups.SAVEDSTATE.group, "savedstate-ktx")
prebuilts(LibraryGroups.SAVEDSTATE, "1.0.0")
// TODO: Remove this ignore once androidx.security:security-biometric:1.0.0-alpha01 is released
ignore(LibraryGroups.SECURITY.group, "security-biometric")
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
index b838883..3580d2a 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaRunner.kt
@@ -22,17 +22,21 @@
import org.gradle.api.artifacts.Configuration
import org.gradle.api.file.FileCollection
import org.gradle.api.provider.ListProperty
-import org.gradle.api.provider.Property
+import org.gradle.api.provider.SetProperty
import org.gradle.process.ExecOperations
import org.gradle.workers.WorkAction
-import org.gradle.workers.WorkerExecutor
import org.gradle.workers.WorkParameters
+import org.gradle.workers.WorkerExecutor
import java.io.File
import javax.inject.Inject
// MetalavaRunner stores common configuration for executing Metalava
-fun runMetalavaWithArgs(metalavaJar: File, args: List<String>, workerExecutor: WorkerExecutor) {
+fun runMetalavaWithArgs(
+ metalavaConfiguration: Configuration,
+ args: List<String>,
+ workerExecutor: WorkerExecutor
+) {
val allArgs = listOf(
"--no-banner",
"--hide",
@@ -42,13 +46,13 @@
val workQueue = workerExecutor.noIsolation()
workQueue.submit(MetalavaWorkAction::class.java) { parameters ->
parameters.getArgs().set(allArgs)
- parameters.getMetalavaJar().set(metalavaJar)
+ parameters.getMetalavaClasspath().set(metalavaConfiguration.files)
}
}
interface MetalavaParams : WorkParameters {
fun getArgs(): ListProperty<String>
- fun getMetalavaJar(): Property<File>
+ fun getMetalavaClasspath(): SetProperty<File>
}
abstract class MetalavaWorkAction @Inject constructor (
@@ -57,7 +61,7 @@
override fun execute() {
val allArgs = getParameters().getArgs().get()
- val metalavaJar = getParameters().getMetalavaJar().get()
+ val metalavaJar = getParameters().getMetalavaClasspath().get()
execOperations.javaexec {
it.classpath(metalavaJar)
@@ -67,13 +71,9 @@
}
}
-fun Project.getMetalavaJar(): File {
- return getMetalavaConfiguration().resolvedConfiguration.files.iterator().next()
-}
-
fun Project.getMetalavaConfiguration(): Configuration {
return configurations.findByName("metalava") ?: configurations.create("metalava") {
- val dependency = dependencies.create("com.android:metalava:1.3.0:shadow@jar")
+ val dependency = dependencies.create("com.android:metalava:1.3.0")
it.dependencies.add(dependency)
}
}
@@ -110,7 +110,6 @@
// The list of checks that are API lint warnings and are yet to be enabled
"ExecutorRegistration",
"NotCloseable",
- "UseIcu",
"SamShouldBeLast",
"MissingJvmstatic",
@@ -133,6 +132,7 @@
"AbstractInner",
"ArrayReturn",
"MethodNameTense",
+ "UseIcu",
"NoByteOrShort",
"CommonArgsFirst"
).joinToString()
@@ -189,7 +189,7 @@
) {
val args = getGenerateApiArgs(bootClasspath, dependencyClasspath, sourcePaths, outputFile,
generateApiMode, apiLintMode, pathToManifest)
- runMetalavaWithArgs(getMetalavaJar(), args, workerExecutor)
+ runMetalavaWithArgs(getMetalavaConfiguration(), args, workerExecutor)
}
// Generates the specified api file
diff --git a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTask.kt b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTask.kt
index 41307f6..e9c8498 100644
--- a/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTask.kt
+++ b/buildSrc/src/main/kotlin/androidx/build/metalava/MetalavaTask.kt
@@ -57,6 +57,6 @@
abstract val manifestPath: RegularFileProperty
fun runWithArgs(args: List<String>) {
- runMetalavaWithArgs(project.getMetalavaJar(), args, workerExecutor)
+ runMetalavaWithArgs(configuration, args, workerExecutor)
}
}
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
index a42fc3a..b0effe5 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
@@ -28,6 +28,7 @@
import androidx.annotation.NonNull;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
+import androidx.camera.testing.fakes.FakeCameraInfoInternal;
import androidx.core.content.ContextCompat;
import androidx.core.util.Consumer;
import androidx.test.core.app.ApplicationProvider;
@@ -187,7 +188,7 @@
}
private SurfaceRequest createNewRequest(@NonNull Size size) {
- SurfaceRequest request = new SurfaceRequest(size);
+ SurfaceRequest request = new SurfaceRequest(size, new FakeCameraInfoInternal());
mSurfaceRequests.add(request);
return request;
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
index 2b5b80d7..d49aef2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
@@ -187,7 +187,8 @@
mSessionDeferrableSurface.close();
}
- final SurfaceRequest surfaceRequest = new SurfaceRequest(resolution);
+ final SurfaceRequest surfaceRequest = new SurfaceRequest(resolution,
+ getBoundCamera().getCameraInfo());
setUpSurfaceProviderWrap(surfaceRequest);
if (captureProcessor != null) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java
index beb129e..61f47d7 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java
@@ -55,6 +55,7 @@
public final class SurfaceRequest {
private final Size mResolution;
+ private final CameraInfo mCameraInfo;
// For the camera to retrieve the surface from the user
@SuppressWarnings("WeakerAccess") /*synthetic accessor */
@@ -72,14 +73,15 @@
private DeferrableSurface mInternalDeferrableSurface;
/**
- * Creates a new surface request with the given resolution.
+ * Creates a new surface request with the given resolution and cameraInfo.
*
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
- public SurfaceRequest(@NonNull Size resolution) {
+ public SurfaceRequest(@NonNull Size resolution, @NonNull CameraInfo cameraInfo) {
super();
mResolution = resolution;
+ mCameraInfo = cameraInfo;
// To ensure concurrency and ordering, operations are chained. Completion can only be
// triggered externally by the top-level completer (mSurfaceCompleter). The other future
@@ -221,6 +223,17 @@
return mResolution;
}
+ /**
+ * Returns the {@link CameraInfo} of the camera which is requesting a {@link Surface}.
+ *
+ * @hide
+ */
+ @NonNull
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ public CameraInfo getCameraInfo() {
+ return mCameraInfo;
+ }
+
/**
* Return the crop rect rectangle.
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java
index a7f5cb2..67f8abf 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewTest.java
@@ -30,6 +30,7 @@
import android.Manifest;
import android.content.Context;
+import android.util.Size;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
@@ -39,6 +40,7 @@
import androidx.camera.core.CameraInfo;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.Preview;
+import androidx.camera.core.SurfaceRequest;
import androidx.camera.testing.fakes.FakeActivity;
import androidx.camera.view.test.R;
import androidx.test.annotation.UiThreadTest;
@@ -48,6 +50,7 @@
import androidx.test.rule.ActivityTestRule;
import androidx.test.rule.GrantPermissionRule;
+import org.junit.After;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -68,16 +71,20 @@
public final ActivityTestRule<FakeActivity> mActivityRule = new ActivityTestRule<>(
FakeActivity.class);
private final Context mContext = ApplicationProvider.getApplicationContext();
+ private SurfaceRequest mSurfaceRequest;
- @Test
- @UiThreadTest
- public void usesTextureView_whenCameraInfoNull() {
- final PreviewView previewView = new PreviewView(mContext);
- setContentView(previewView);
- previewView.setPreferredImplementationMode(SURFACE_VIEW);
- previewView.createSurfaceProvider(null);
+ private SurfaceRequest createSurfaceRequest(CameraInfo cameraInfo) {
+ return new SurfaceRequest(new Size(640, 480), cameraInfo);
+ }
- assertThat(previewView.mImplementation).isInstanceOf(TextureViewImplementation.class);
+ @After
+ public void tearDown() {
+ if (mSurfaceRequest != null) {
+ mSurfaceRequest.willNotProvideSurface();
+ // Ensure all successful requests have their returned future finish.
+ mSurfaceRequest.getDeferrableSurface().close();
+ mSurfaceRequest = null;
+ }
}
@Test
@@ -90,7 +97,9 @@
final PreviewView previewView = new PreviewView(mContext);
setContentView(previewView);
previewView.setPreferredImplementationMode(SURFACE_VIEW);
- previewView.createSurfaceProvider(cameraInfo);
+ Preview.SurfaceProvider surfaceProvider = previewView.createSurfaceProvider();
+ mSurfaceRequest = createSurfaceRequest(cameraInfo);
+ surfaceProvider.onSurfaceRequested(mSurfaceRequest);
assertThat(previewView.mImplementation).isInstanceOf(TextureViewImplementation.class);
}
@@ -105,7 +114,9 @@
final PreviewView previewView = new PreviewView(mContext);
setContentView(previewView);
previewView.setPreferredImplementationMode(SURFACE_VIEW);
- previewView.createSurfaceProvider(cameraInfo);
+ Preview.SurfaceProvider surfaceProvider = previewView.createSurfaceProvider();
+ mSurfaceRequest = createSurfaceRequest(cameraInfo);
+ surfaceProvider.onSurfaceRequested(mSurfaceRequest);
assertThat(previewView.mImplementation).isInstanceOf(SurfaceViewImplementation.class);
}
@@ -120,7 +131,9 @@
final PreviewView previewView = new PreviewView(mContext);
setContentView(previewView);
previewView.setPreferredImplementationMode(TEXTURE_VIEW);
- previewView.createSurfaceProvider(cameraInfo);
+ Preview.SurfaceProvider surfaceProvider = previewView.createSurfaceProvider();
+ mSurfaceRequest = createSurfaceRequest(cameraInfo);
+ surfaceProvider.onSurfaceRequested(mSurfaceRequest);
assertThat(previewView.mImplementation).isInstanceOf(TextureViewImplementation.class);
}
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java
index d9d9949..71b0fc970 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java
@@ -29,6 +29,7 @@
import androidx.annotation.NonNull;
import androidx.camera.core.SurfaceRequest;
import androidx.camera.core.impl.DeferrableSurface;
+import androidx.camera.testing.fakes.FakeCameraInfoInternal;
import androidx.camera.view.preview.transform.PreviewTransform;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
@@ -282,7 +283,7 @@
@NonNull
private SurfaceRequest getSurfaceRequest() {
if (mSurfaceRequest == null) {
- mSurfaceRequest = new SurfaceRequest(ANY_SIZE);
+ mSurfaceRequest = new SurfaceRequest(ANY_SIZE, new FakeCameraInfoInternal());
}
return mSurfaceRequest;
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java b/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java
index 69b7cf1..69191ed 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/CameraXModule.java
@@ -228,7 +228,7 @@
mPreviewBuilder.setTargetResolution(new Size(getMeasuredWidth(), height));
mPreview = mPreviewBuilder.build();
- mPreview.setSurfaceProvider(mCameraView.getPreviewView().createSurfaceProvider(null));
+ mPreview.setSurfaceProvider(mCameraView.getPreviewView().createSurfaceProvider());
CameraSelector cameraSelector =
new CameraSelector.Builder().requireLensFacing(mCameraLensFacing).build();
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
index 3b9890a..a816f44 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
@@ -159,22 +159,23 @@
* determined by the {@linkplain #setPreferredImplementationMode(ImplementationMode)
* preferred implementation mode} and the device's capabilities.
*
- * @param cameraInfo The {@link CameraInfo} of the camera that will use the
- * {@link android.view.Surface} provided by the returned
- * {@link Preview.SurfaceProvider}.
* @return A {@link Preview.SurfaceProvider} used to start the camera preview.
*/
@NonNull
@UiThread
- public Preview.SurfaceProvider createSurfaceProvider(@Nullable CameraInfo cameraInfo) {
+ public Preview.SurfaceProvider createSurfaceProvider() {
Threads.checkMainThread();
removeAllViews();
- final ImplementationMode actualImplementationMode = computeImplementationMode(cameraInfo,
- mPreferredImplementationMode);
- mImplementation = computeImplementation(actualImplementationMode);
- mImplementation.init(this, mPreviewTransform);
- return mImplementation.getSurfaceProvider();
+ return surfaceRequest -> {
+ CameraInfo cameraInfo = surfaceRequest.getCameraInfo();
+ final ImplementationMode actualImplementationMode =
+ computeImplementationMode(cameraInfo, mPreferredImplementationMode);
+ mImplementation = computeImplementation(actualImplementationMode);
+ mImplementation.init(this, mPreviewTransform);
+
+ mImplementation.getSurfaceProvider().onSurfaceRequested(surfaceRequest);
+ };
}
/**
diff --git a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
index ad6033b..485f30e 100644
--- a/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
+++ b/camera/integration-tests/extensionstestapp/src/main/java/androidx/camera/integration/extensions/CameraExtensionsActivity.java
@@ -176,7 +176,7 @@
}
});
mPreview = builder.build();
- mPreview.setSurfaceProvider(mPreviewView.createSurfaceProvider(null));
+ mPreview.setSurfaceProvider(mPreviewView.createSurfaceProvider());
}
enum ImageCaptureType {
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
index 41b0215..fc2e052 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/PreviewViewFragment.java
@@ -30,7 +30,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
-import androidx.camera.core.Camera;
import androidx.camera.core.CameraInfoUnavailableException;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.Preview;
@@ -178,10 +177,9 @@
final Preview preview = new Preview.Builder()
.setTargetName("Preview")
.build();
- final Camera camera = cameraProvider.bindToLifecycle(this, getCurrentCameraSelector(),
- preview);
+ cameraProvider.bindToLifecycle(this, getCurrentCameraSelector(), preview);
mPreviewView.setPreferredImplementationMode(PreviewView.ImplementationMode.TEXTURE_VIEW);
- preview.setSurfaceProvider(mPreviewView.createSurfaceProvider(camera.getCameraInfo()));
+ preview.setSurfaceProvider(mPreviewView.createSurfaceProvider());
}
@SuppressWarnings("WeakerAccess")
diff --git a/collection/OWNERS b/collection/OWNERS
index e450f4c..a02ebce 100644
--- a/collection/OWNERS
+++ b/collection/OWNERS
@@ -1 +1,2 @@
[email protected]
[email protected]
diff --git a/collection/collection/api/1.2.0-alpha01.ignore b/collection/collection/api/1.2.0-alpha01.ignore
new file mode 100644
index 0000000..7876d30
--- /dev/null
+++ b/collection/collection/api/1.2.0-alpha01.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+InvalidNullConversion: androidx.collection.ArraySet#valueAt(int):
+ Attempted to remove @Nullable annotation from method androidx.collection.ArraySet.valueAt(int)
diff --git a/collection/collection/api/1.2.0-alpha01.txt b/collection/collection/api/1.2.0-alpha01.txt
index 7d0bd29..975bc87 100644
--- a/collection/collection/api/1.2.0-alpha01.txt
+++ b/collection/collection/api/1.2.0-alpha01.txt
@@ -37,7 +37,7 @@
method public int size();
method public Object![] toArray();
method public <T> T![] toArray(T![]);
- method public E? valueAt(int);
+ method public E! valueAt(int);
}
public final class CircularArray<E> {
diff --git a/collection/collection/api/current.txt b/collection/collection/api/current.txt
index 7d0bd29..975bc87 100644
--- a/collection/collection/api/current.txt
+++ b/collection/collection/api/current.txt
@@ -37,7 +37,7 @@
method public int size();
method public Object![] toArray();
method public <T> T![] toArray(T![]);
- method public E? valueAt(int);
+ method public E! valueAt(int);
}
public final class CircularArray<E> {
diff --git a/collection/collection/api/public_plus_experimental_1.2.0-alpha01.txt b/collection/collection/api/public_plus_experimental_1.2.0-alpha01.txt
index 7d0bd29..975bc87 100644
--- a/collection/collection/api/public_plus_experimental_1.2.0-alpha01.txt
+++ b/collection/collection/api/public_plus_experimental_1.2.0-alpha01.txt
@@ -37,7 +37,7 @@
method public int size();
method public Object![] toArray();
method public <T> T![] toArray(T![]);
- method public E? valueAt(int);
+ method public E! valueAt(int);
}
public final class CircularArray<E> {
diff --git a/collection/collection/api/public_plus_experimental_current.txt b/collection/collection/api/public_plus_experimental_current.txt
index 7d0bd29..975bc87 100644
--- a/collection/collection/api/public_plus_experimental_current.txt
+++ b/collection/collection/api/public_plus_experimental_current.txt
@@ -37,7 +37,7 @@
method public int size();
method public Object![] toArray();
method public <T> T![] toArray(T![]);
- method public E? valueAt(int);
+ method public E! valueAt(int);
}
public final class CircularArray<E> {
diff --git a/collection/collection/api/restricted_1.2.0-alpha01.ignore b/collection/collection/api/restricted_1.2.0-alpha01.ignore
new file mode 100644
index 0000000..7876d30
--- /dev/null
+++ b/collection/collection/api/restricted_1.2.0-alpha01.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+InvalidNullConversion: androidx.collection.ArraySet#valueAt(int):
+ Attempted to remove @Nullable annotation from method androidx.collection.ArraySet.valueAt(int)
diff --git a/collection/collection/api/restricted_1.2.0-alpha01.txt b/collection/collection/api/restricted_1.2.0-alpha01.txt
index 7d0bd29..975bc87 100644
--- a/collection/collection/api/restricted_1.2.0-alpha01.txt
+++ b/collection/collection/api/restricted_1.2.0-alpha01.txt
@@ -37,7 +37,7 @@
method public int size();
method public Object![] toArray();
method public <T> T![] toArray(T![]);
- method public E? valueAt(int);
+ method public E! valueAt(int);
}
public final class CircularArray<E> {
diff --git a/collection/collection/api/restricted_current.txt b/collection/collection/api/restricted_current.txt
index 7d0bd29..975bc87 100644
--- a/collection/collection/api/restricted_current.txt
+++ b/collection/collection/api/restricted_current.txt
@@ -37,7 +37,7 @@
method public int size();
method public Object![] toArray();
method public <T> T![] toArray(T![]);
- method public E? valueAt(int);
+ method public E! valueAt(int);
}
public final class CircularArray<E> {
diff --git a/collection/collection/src/main/java/androidx/collection/ArrayMap.java b/collection/collection/src/main/java/androidx/collection/ArrayMap.java
index b3b918c..51401cc 100644
--- a/collection/collection/src/main/java/androidx/collection/ArrayMap.java
+++ b/collection/collection/src/main/java/androidx/collection/ArrayMap.java
@@ -19,8 +19,11 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import java.lang.reflect.Array;
import java.util.Collection;
+import java.util.Iterator;
import java.util.Map;
+import java.util.NoSuchElementException;
import java.util.Set;
/**
@@ -51,7 +54,9 @@
* explicit call to set the capacity should turn off this aggressive shrinking behavior.</p>
*/
public class ArrayMap<K, V> extends SimpleArrayMap<K, V> implements Map<K, V> {
- @Nullable MapCollections<K, V> mCollections;
+ @Nullable EntrySet mEntrySet;
+ @Nullable KeySet mKeySet;
+ @Nullable ValueCollection mValues;
public ArrayMap() {
super();
@@ -72,58 +77,6 @@
super(map);
}
- private MapCollections<K, V> getCollection() {
- if (mCollections == null) {
- mCollections = new MapCollections<K, V>() {
- @Override
- protected int colGetSize() {
- return mSize;
- }
-
- @Override
- protected Object colGetEntry(int index, int offset) {
- return mArray[(index<<1) + offset];
- }
-
- @Override
- protected int colIndexOfKey(Object key) {
- return indexOfKey(key);
- }
-
- @Override
- protected int colIndexOfValue(Object value) {
- return indexOfValue(value);
- }
-
- @Override
- protected Map<K, V> colGetMap() {
- return ArrayMap.this;
- }
-
- @Override
- protected void colPut(K key, V value) {
- put(key, value);
- }
-
- @Override
- protected V colSetValue(int index, V value) {
- return setValueAt(index, value);
- }
-
- @Override
- protected void colRemoveAt(int index) {
- removeAt(index);
- }
-
- @Override
- protected void colClear() {
- clear();
- }
- };
- }
- return mCollections;
- }
-
/**
* Determine if the array map contains all of the keys in the given collection.
* @param collection The collection whose contents are to be checked against.
@@ -131,7 +84,12 @@
* in <var>collection</var>, else returns false.
*/
public boolean containsAll(@NonNull Collection<?> collection) {
- return MapCollections.containsAllHelper(this, collection);
+ for (Object o : collection) {
+ if (!containsKey(o)) {
+ return false;
+ }
+ }
+ return true;
}
/**
@@ -152,7 +110,11 @@
* @return Returns true if any keys were removed from the array map, else false.
*/
public boolean removeAll(@NonNull Collection<?> collection) {
- return MapCollections.removeAllHelper(this, collection);
+ int oldSize = mSize;
+ for (Object o : collection) {
+ remove(o);
+ }
+ return oldSize != mSize;
}
/**
@@ -162,7 +124,13 @@
* @return Returns true if any keys were removed from the array map, else false.
*/
public boolean retainAll(@NonNull Collection<?> collection) {
- return MapCollections.retainAllHelper(this, collection);
+ int oldSize = mSize;
+ for (int i = mSize - 1; i >= 0; i--) {
+ if (!collection.contains(keyAt(i))) {
+ removeAt(i);
+ }
+ }
+ return oldSize != mSize;
}
/**
@@ -181,7 +149,11 @@
@NonNull
@Override
public Set<Entry<K, V>> entrySet() {
- return getCollection().getEntrySet();
+ Set<Entry<K, V>> entrySet = mEntrySet;
+ if (entrySet == null) {
+ entrySet = mEntrySet = new EntrySet();
+ }
+ return entrySet;
}
/**
@@ -194,7 +166,11 @@
@NonNull
@Override
public Set<K> keySet() {
- return getCollection().getKeySet();
+ Set<K> keySet = mKeySet;
+ if (keySet == null) {
+ keySet = mKeySet = new KeySet();
+ }
+ return keySet;
}
/**
@@ -207,6 +183,469 @@
@NonNull
@Override
public Collection<V> values() {
- return getCollection().getValues();
+ Collection<V> values = mValues;
+ if (values == null) {
+ values = mValues = new ValueCollection();
+ }
+ return values;
+ }
+
+ final class EntrySet implements Set<Map.Entry<K, V>> {
+ @Override
+ public boolean add(Map.Entry<K, V> object) {
+ // TODO support
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean addAll(Collection<? extends Map.Entry<K, V>> collection) {
+ int oldSize = mSize;
+ for (Map.Entry<K, V> entry : collection) {
+ put(entry.getKey(), entry.getValue());
+ }
+ return oldSize != mSize; // TODO broken heuristic
+ }
+
+ @Override
+ public void clear() {
+ ArrayMap.this.clear();
+ }
+
+ @Override
+ public boolean contains(Object o) {
+ if (!(o instanceof Map.Entry))
+ return false;
+ Map.Entry<?, ?> e = (Map.Entry<?, ?>) o;
+ int index = indexOfKey(e.getKey());
+ if (index < 0) {
+ return false;
+ }
+ V foundVal = valueAt(index);
+ return ContainerHelpers.equal(foundVal, e.getValue());
+ }
+
+ @Override
+ public boolean containsAll(Collection<?> collection) {
+ for (Object o : collection) {
+ if (!contains(o)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return ArrayMap.this.isEmpty();
+ }
+
+ @Override
+ public Iterator<Map.Entry<K, V>> iterator() {
+ return new MapIterator();
+ }
+
+ @Override
+ public boolean remove(Object object) {
+ // TODO support
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean removeAll(Collection<?> collection) {
+ // TODO support
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean retainAll(Collection<?> collection) {
+ // TODO support
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int size() {
+ return mSize;
+ }
+
+ @Override
+ public Object[] toArray() {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public <T> T[] toArray(T[] array) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return equalsSetHelper(this, object);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 0;
+ for (int i=mSize-1; i>=0; i--) {
+ K key = keyAt(i);
+ V value = valueAt(i);
+ result += ( (key == null ? 0 : key.hashCode()) ^
+ (value == null ? 0 : value.hashCode()) );
+ }
+ return result;
+ }
+ }
+
+ final class KeySet implements Set<K> {
+ @Override
+ public boolean add(K object) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean addAll(Collection<? extends K> collection) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void clear() {
+ ArrayMap.this.clear();
+ }
+
+ @Override
+ public boolean contains(Object object) {
+ return containsKey(object);
+ }
+
+ @Override
+ public boolean containsAll(Collection<?> collection) {
+ return ArrayMap.this.containsAll(collection);
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return ArrayMap.this.isEmpty();
+ }
+
+ @Override
+ public Iterator<K> iterator() {
+ return new KeyIterator();
+ }
+
+ @Override
+ public boolean remove(Object object) {
+ int index = indexOfKey(object);
+ if (index >= 0) {
+ removeAt(index);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean removeAll(Collection<?> collection) {
+ return ArrayMap.this.removeAll(collection);
+ }
+
+ @Override
+ public boolean retainAll(Collection<?> collection) {
+ return ArrayMap.this.retainAll(collection);
+ }
+
+ @Override
+ public int size() {
+ return mSize;
+ }
+
+ @Override
+ public Object[] toArray() {
+ final int N = mSize;
+ Object[] result = new Object[N];
+ for (int i=0; i<N; i++) {
+ result[i] = keyAt(i);
+ }
+ return result;
+ }
+
+ @Override
+ public <T> T[] toArray(T[] array) {
+ return toArrayHelper(array, 0);
+ }
+
+ @Override
+ public boolean equals(Object object) {
+ return equalsSetHelper(this, object);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 0;
+ for (int i=mSize-1; i>=0; i--) {
+ K obj = keyAt(i);
+ result += obj == null ? 0 : obj.hashCode();
+ }
+ return result;
+ }
+ }
+
+ final class ValueCollection implements Collection<V> {
+ @Override
+ public boolean add(V object) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean addAll(Collection<? extends V> collection) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void clear() {
+ ArrayMap.this.clear();
+ }
+
+ @Override
+ public boolean contains(Object object) {
+ return indexOfValue(object) >= 0;
+ }
+
+ @Override
+ public boolean containsAll(Collection<?> collection) {
+ for (Object o : collection) {
+ if (!contains(o)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean isEmpty() {
+ return ArrayMap.this.isEmpty();
+ }
+
+ @Override
+ public Iterator<V> iterator() {
+ return new ValueIterator();
+ }
+
+ @Override
+ public boolean remove(Object object) {
+ int index = indexOfValue(object);
+ if (index >= 0) {
+ removeAt(index);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean removeAll(Collection<?> collection) {
+ int N = mSize;
+ boolean changed = false;
+ for (int i=0; i<N; i++) {
+ V cur = valueAt(i);
+ if (collection.contains(cur)) {
+ removeAt(i);
+ i--;
+ N--;
+ changed = true;
+ }
+ }
+ return changed;
+ }
+
+ @Override
+ public boolean retainAll(Collection<?> collection) {
+ int N = mSize;
+ boolean changed = false;
+ for (int i=0; i<N; i++) {
+ V cur = valueAt(i);
+ if (!collection.contains(cur)) {
+ removeAt(i);
+ i--;
+ N--;
+ changed = true;
+ }
+ }
+ return changed;
+ }
+
+ @Override
+ public int size() {
+ return mSize;
+ }
+
+ @Override
+ public Object[] toArray() {
+ final int N = mSize;
+ Object[] result = new Object[N];
+ for (int i=0; i<N; i++) {
+ result[i] = valueAt(i);
+ }
+ return result;
+ }
+
+ @Override
+ public <T> T[] toArray(T[] array) {
+ return toArrayHelper(array, 1);
+ }
+ }
+
+ final class KeyIterator extends IndexBasedArrayIterator<K> {
+ KeyIterator() {
+ super(ArrayMap.this.mSize);
+ }
+
+ @Override
+ protected K elementAt(int index) {
+ return keyAt(index);
+ }
+
+ @Override
+ protected void removeAt(int index) {
+ ArrayMap.this.removeAt(index);
+ }
+ }
+
+ final class ValueIterator extends IndexBasedArrayIterator<V> {
+ ValueIterator() {
+ super(ArrayMap.this.mSize);
+ }
+
+ @Override
+ protected V elementAt(int index) {
+ return valueAt(index);
+ }
+
+ @Override
+ protected void removeAt(int index) {
+ ArrayMap.this.removeAt(index);
+ }
+ }
+
+ final class MapIterator implements Iterator<Map.Entry<K, V>>, Map.Entry<K, V> {
+ int mEnd;
+ int mIndex;
+ boolean mEntryValid;
+
+ MapIterator() {
+ mEnd = mSize - 1;
+ mIndex = -1;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return mIndex < mEnd;
+ }
+
+ @Override
+ public Map.Entry<K, V> next() {
+ if (!hasNext()) throw new NoSuchElementException();
+ mIndex++;
+ mEntryValid = true;
+ return this;
+ }
+
+ @Override
+ public void remove() {
+ if (!mEntryValid) {
+ throw new IllegalStateException();
+ }
+ removeAt(mIndex);
+ mIndex--;
+ mEnd--;
+ mEntryValid = false;
+ }
+
+ @Override
+ public K getKey() {
+ if (!mEntryValid) {
+ throw new IllegalStateException(
+ "This container does not support retaining Map.Entry objects");
+ }
+ return keyAt(mIndex);
+ }
+
+ @Override
+ public V getValue() {
+ if (!mEntryValid) {
+ throw new IllegalStateException(
+ "This container does not support retaining Map.Entry objects");
+ }
+ return valueAt(mIndex);
+ }
+
+ @Override
+ public V setValue(V object) {
+ if (!mEntryValid) {
+ throw new IllegalStateException(
+ "This container does not support retaining Map.Entry objects");
+ }
+ return setValueAt(mIndex, object);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (!mEntryValid) {
+ throw new IllegalStateException(
+ "This container does not support retaining Map.Entry objects");
+ }
+ if (!(o instanceof Map.Entry)) {
+ return false;
+ }
+ Map.Entry<?, ?> e = (Map.Entry<?, ?>) o;
+ return ContainerHelpers.equal(e.getKey(), keyAt(mIndex))
+ && ContainerHelpers.equal(e.getValue(), valueAt(mIndex));
+ }
+
+ @Override
+ public int hashCode() {
+ if (!mEntryValid) {
+ throw new IllegalStateException(
+ "This container does not support retaining Map.Entry objects");
+ }
+ K key = keyAt(mIndex);
+ V value = valueAt(mIndex);
+ return (key == null ? 0 : key.hashCode()) ^
+ (value == null ? 0 : value.hashCode());
+ }
+
+ @Override
+ public String toString() {
+ return getKey() + "=" + getValue();
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ <T> T[] toArrayHelper(T[] array, int offset) {
+ final int N = mSize;
+ if (array.length < N) {
+ @SuppressWarnings("unchecked") T[] newArray
+ = (T[]) Array.newInstance(array.getClass().getComponentType(), N);
+ array = newArray;
+ }
+ for (int i=0; i<N; i++) {
+ array[i] = (T) mArray[(i<<1)+offset];
+ }
+ if (array.length > N) {
+ array[N] = null;
+ }
+ return array;
+ }
+
+ static <T> boolean equalsSetHelper(Set<T> set, Object object) {
+ if (set == object) {
+ return true;
+ }
+ if (object instanceof Set) {
+ Set<?> s = (Set<?>) object;
+
+ try {
+ return set.size() == s.size() && set.containsAll(s);
+ } catch (NullPointerException ignored) {
+ } catch (ClassCastException ignored) {
+ }
+ }
+ return false;
}
}
diff --git a/collection/collection/src/main/java/androidx/collection/ArraySet.java b/collection/collection/src/main/java/androidx/collection/ArraySet.java
index 541bd0a..a74e3f9 100644
--- a/collection/collection/src/main/java/androidx/collection/ArraySet.java
+++ b/collection/collection/src/main/java/androidx/collection/ArraySet.java
@@ -23,7 +23,6 @@
import java.util.Collection;
import java.util.ConcurrentModificationException;
import java.util.Iterator;
-import java.util.Map;
import java.util.Set;
/**
@@ -84,7 +83,6 @@
Object[] mArray;
@SuppressWarnings("WeakerAccess") /* synthetic access */
int mSize;
- private MapCollections<E, E> mCollections;
private int binarySearch(int hash) {
try {
@@ -381,7 +379,6 @@
* @param index The desired index, must be between 0 and {@link #size()}-1.
* @return Returns the value stored at the given index.
*/
- @Nullable
@SuppressWarnings("unchecked")
public E valueAt(int index) {
return (E) mArray[index];
@@ -690,74 +687,32 @@
return buffer.toString();
}
- // ------------------------------------------------------------------------
- // Interop with traditional Java containers. Not as efficient as using
- // specialized collection APIs.
- // ------------------------------------------------------------------------
-
- private MapCollections<E, E> getCollection() {
- if (mCollections == null) {
- mCollections = new MapCollections<E, E>() {
- @Override
- protected int colGetSize() {
- return mSize;
- }
-
- @Override
- protected Object colGetEntry(int index, int offset) {
- return mArray[index];
- }
-
- @Override
- protected int colIndexOfKey(Object key) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- protected int colIndexOfValue(Object value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- protected Map<E, E> colGetMap() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- protected void colPut(E key, E value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- protected E colSetValue(int index, E value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- protected void colRemoveAt(int index) {
- removeAt(index);
- }
-
- @Override
- protected void colClear() {
- throw new UnsupportedOperationException();
- }
- };
- }
- return mCollections;
- }
-
/**
* Return an {@link java.util.Iterator} over all values in the set.
*
- * <p><b>Note:</b> this is a fairly inefficient way to access the array contents, it
- * requires generating a number of temporary objects and allocates additional state
- * information associated with the container that will remain for the life of the container.</p>
+ * <p><b>Note:</b> this is aless efficient way to access the array contents compared to
+ * looping from 0 until {@link #size()} and calling {@link #valueAt(int)}.
*/
@NonNull
@Override
public Iterator<E> iterator() {
- return getCollection().new ArrayIterator<>(0);
+ return new ElementIterator();
+ }
+
+ private class ElementIterator extends IndexBasedArrayIterator<E> {
+ ElementIterator() {
+ super(mSize);
+ }
+
+ @Override
+ protected E elementAt(int index) {
+ return valueAt(index);
+ }
+
+ @Override
+ protected void removeAt(int index) {
+ ArraySet.this.removeAt(index);
+ }
}
/**
diff --git a/collection/collection/src/main/java/androidx/collection/IndexBasedArrayIterator.java b/collection/collection/src/main/java/androidx/collection/IndexBasedArrayIterator.java
new file mode 100644
index 0000000..9b10713
--- /dev/null
+++ b/collection/collection/src/main/java/androidx/collection/IndexBasedArrayIterator.java
@@ -0,0 +1,58 @@
+/*
+ * 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.collection;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+abstract class IndexBasedArrayIterator<T> implements Iterator<T> {
+ private int mSize;
+ private int mIndex;
+ private boolean mCanRemove;
+
+ IndexBasedArrayIterator(int startingSize) {
+ mSize = startingSize;
+ }
+
+ protected abstract T elementAt(int index);
+ protected abstract void removeAt(int index);
+
+ @Override
+ public final boolean hasNext() {
+ return mIndex < mSize;
+ }
+
+ @Override
+ public T next() {
+ if (!hasNext()) throw new NoSuchElementException();
+ T res = elementAt(mIndex);
+ mIndex++;
+ mCanRemove = true;
+ return res;
+ }
+
+ @Override
+ public void remove() {
+ if (!mCanRemove) {
+ throw new IllegalStateException();
+ }
+ // Attempt removal first so an UnsupportedOperationException retains a valid state.
+ removeAt(mIndex--);
+ mSize--;
+ mCanRemove = false;
+ }
+}
diff --git a/collection/collection/src/main/java/androidx/collection/MapCollections.java b/collection/collection/src/main/java/androidx/collection/MapCollections.java
deleted file mode 100644
index ff74d7c..0000000
--- a/collection/collection/src/main/java/androidx/collection/MapCollections.java
+++ /dev/null
@@ -1,566 +0,0 @@
-/*
- * Copyright 2018 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.collection;
-
-import androidx.annotation.Nullable;
-
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * Helper for writing standard Java collection interfaces to a data
- * structure like {@link ArrayMap}.
- */
-abstract class MapCollections<K, V> {
- @Nullable EntrySet mEntrySet;
- @Nullable KeySet mKeySet;
- @Nullable ValuesCollection mValues;
-
- final class ArrayIterator<T> implements Iterator<T> {
- final int mOffset;
- int mSize;
- int mIndex;
- boolean mCanRemove = false;
-
- ArrayIterator(int offset) {
- mOffset = offset;
- mSize = colGetSize();
- }
-
- @Override
- public boolean hasNext() {
- return mIndex < mSize;
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public T next() {
- if (!hasNext()) throw new NoSuchElementException();
- Object res = colGetEntry(mIndex, mOffset);
- mIndex++;
- mCanRemove = true;
- return (T)res;
- }
-
- @Override
- public void remove() {
- if (!mCanRemove) {
- throw new IllegalStateException();
- }
- mIndex--;
- mSize--;
- mCanRemove = false;
- colRemoveAt(mIndex);
- }
- }
-
- final class MapIterator implements Iterator<Map.Entry<K, V>>, Map.Entry<K, V> {
- int mEnd;
- int mIndex;
- boolean mEntryValid = false;
-
- MapIterator() {
- mEnd = colGetSize() - 1;
- mIndex = -1;
- }
-
- @Override
- public boolean hasNext() {
- return mIndex < mEnd;
- }
-
- @Override
- public Map.Entry<K, V> next() {
- if (!hasNext()) throw new NoSuchElementException();
- mIndex++;
- mEntryValid = true;
- return this;
- }
-
- @Override
- public void remove() {
- if (!mEntryValid) {
- throw new IllegalStateException();
- }
- colRemoveAt(mIndex);
- mIndex--;
- mEnd--;
- mEntryValid = false;
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public K getKey() {
- if (!mEntryValid) {
- throw new IllegalStateException(
- "This container does not support retaining Map.Entry objects");
- }
- return (K)colGetEntry(mIndex, 0);
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public V getValue() {
- if (!mEntryValid) {
- throw new IllegalStateException(
- "This container does not support retaining Map.Entry objects");
- }
- return (V)colGetEntry(mIndex, 1);
- }
-
- @Override
- public V setValue(V object) {
- if (!mEntryValid) {
- throw new IllegalStateException(
- "This container does not support retaining Map.Entry objects");
- }
- return colSetValue(mIndex, object);
- }
-
- @Override
- public boolean equals(Object o) {
- if (!mEntryValid) {
- throw new IllegalStateException(
- "This container does not support retaining Map.Entry objects");
- }
- if (!(o instanceof Map.Entry)) {
- return false;
- }
- Map.Entry<?, ?> e = (Map.Entry<?, ?>) o;
- return ContainerHelpers.equal(e.getKey(), colGetEntry(mIndex, 0))
- && ContainerHelpers.equal(e.getValue(), colGetEntry(mIndex, 1));
- }
-
- @Override
- public int hashCode() {
- if (!mEntryValid) {
- throw new IllegalStateException(
- "This container does not support retaining Map.Entry objects");
- }
- final Object key = colGetEntry(mIndex, 0);
- final Object value = colGetEntry(mIndex, 1);
- return (key == null ? 0 : key.hashCode()) ^
- (value == null ? 0 : value.hashCode());
- }
-
- @Override
- public String toString() {
- return getKey() + "=" + getValue();
- }
- }
-
- final class EntrySet implements Set<Map.Entry<K, V>> {
- @Override
- public boolean add(Map.Entry<K, V> object) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean addAll(Collection<? extends Map.Entry<K, V>> collection) {
- int oldSize = colGetSize();
- for (Map.Entry<K, V> entry : collection) {
- colPut(entry.getKey(), entry.getValue());
- }
- return oldSize != colGetSize();
- }
-
- @Override
- public void clear() {
- colClear();
- }
-
- @Override
- public boolean contains(Object o) {
- if (!(o instanceof Map.Entry))
- return false;
- Map.Entry<?, ?> e = (Map.Entry<?, ?>) o;
- int index = colIndexOfKey(e.getKey());
- if (index < 0) {
- return false;
- }
- Object foundVal = colGetEntry(index, 1);
- return ContainerHelpers.equal(foundVal, e.getValue());
- }
-
- @Override
- public boolean containsAll(Collection<?> collection) {
- Iterator<?> it = collection.iterator();
- while (it.hasNext()) {
- if (!contains(it.next())) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public boolean isEmpty() {
- return colGetSize() == 0;
- }
-
- @Override
- public Iterator<Map.Entry<K, V>> iterator() {
- return new MapIterator();
- }
-
- @Override
- public boolean remove(Object object) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean removeAll(Collection<?> collection) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean retainAll(Collection<?> collection) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public int size() {
- return colGetSize();
- }
-
- @Override
- public Object[] toArray() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public <T> T[] toArray(T[] array) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean equals(Object object) {
- return equalsSetHelper(this, object);
- }
-
- @Override
- public int hashCode() {
- int result = 0;
- for (int i=colGetSize()-1; i>=0; i--) {
- final Object key = colGetEntry(i, 0);
- final Object value = colGetEntry(i, 1);
- result += ( (key == null ? 0 : key.hashCode()) ^
- (value == null ? 0 : value.hashCode()) );
- }
- return result;
- }
- };
-
- final class KeySet implements Set<K> {
-
- @Override
- public boolean add(K object) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean addAll(Collection<? extends K> collection) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void clear() {
- colClear();
- }
-
- @Override
- public boolean contains(Object object) {
- return colIndexOfKey(object) >= 0;
- }
-
- @Override
- public boolean containsAll(Collection<?> collection) {
- return containsAllHelper(colGetMap(), collection);
- }
-
- @Override
- public boolean isEmpty() {
- return colGetSize() == 0;
- }
-
- @Override
- public Iterator<K> iterator() {
- return new ArrayIterator<K>(0);
- }
-
- @Override
- public boolean remove(Object object) {
- int index = colIndexOfKey(object);
- if (index >= 0) {
- colRemoveAt(index);
- return true;
- }
- return false;
- }
-
- @Override
- public boolean removeAll(Collection<?> collection) {
- return removeAllHelper(colGetMap(), collection);
- }
-
- @Override
- public boolean retainAll(Collection<?> collection) {
- return retainAllHelper(colGetMap(), collection);
- }
-
- @Override
- public int size() {
- return colGetSize();
- }
-
- @Override
- public Object[] toArray() {
- return toArrayHelper(0);
- }
-
- @Override
- public <T> T[] toArray(T[] array) {
- return toArrayHelper(array, 0);
- }
-
- @Override
- public boolean equals(Object object) {
- return equalsSetHelper(this, object);
- }
-
- @Override
- public int hashCode() {
- int result = 0;
- for (int i=colGetSize()-1; i>=0; i--) {
- Object obj = colGetEntry(i, 0);
- result += obj == null ? 0 : obj.hashCode();
- }
- return result;
- }
- };
-
- final class ValuesCollection implements Collection<V> {
-
- @Override
- public boolean add(V object) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean addAll(Collection<? extends V> collection) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void clear() {
- colClear();
- }
-
- @Override
- public boolean contains(Object object) {
- return colIndexOfValue(object) >= 0;
- }
-
- @Override
- public boolean containsAll(Collection<?> collection) {
- Iterator<?> it = collection.iterator();
- while (it.hasNext()) {
- if (!contains(it.next())) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public boolean isEmpty() {
- return colGetSize() == 0;
- }
-
- @Override
- public Iterator<V> iterator() {
- return new ArrayIterator<V>(1);
- }
-
- @Override
- public boolean remove(Object object) {
- int index = colIndexOfValue(object);
- if (index >= 0) {
- colRemoveAt(index);
- return true;
- }
- return false;
- }
-
- @Override
- public boolean removeAll(Collection<?> collection) {
- int N = colGetSize();
- boolean changed = false;
- for (int i=0; i<N; i++) {
- Object cur = colGetEntry(i, 1);
- if (collection.contains(cur)) {
- colRemoveAt(i);
- i--;
- N--;
- changed = true;
- }
- }
- return changed;
- }
-
- @Override
- public boolean retainAll(Collection<?> collection) {
- int N = colGetSize();
- boolean changed = false;
- for (int i=0; i<N; i++) {
- Object cur = colGetEntry(i, 1);
- if (!collection.contains(cur)) {
- colRemoveAt(i);
- i--;
- N--;
- changed = true;
- }
- }
- return changed;
- }
-
- @Override
- public int size() {
- return colGetSize();
- }
-
- @Override
- public Object[] toArray() {
- return toArrayHelper(1);
- }
-
- @Override
- public <T> T[] toArray(T[] array) {
- return toArrayHelper(array, 1);
- }
- };
-
- public static <K, V> boolean containsAllHelper(Map<K, V> map, Collection<?> collection) {
- Iterator<?> it = collection.iterator();
- while (it.hasNext()) {
- if (!map.containsKey(it.next())) {
- return false;
- }
- }
- return true;
- }
-
- public static <K, V> boolean removeAllHelper(Map<K, V> map, Collection<?> collection) {
- int oldSize = map.size();
- Iterator<?> it = collection.iterator();
- while (it.hasNext()) {
- map.remove(it.next());
- }
- return oldSize != map.size();
- }
-
- public static <K, V> boolean retainAllHelper(Map<K, V> map, Collection<?> collection) {
- int oldSize = map.size();
- Iterator<K> it = map.keySet().iterator();
- while (it.hasNext()) {
- if (!collection.contains(it.next())) {
- it.remove();
- }
- }
- return oldSize != map.size();
- }
-
-
- public Object[] toArrayHelper(int offset) {
- final int N = colGetSize();
- Object[] result = new Object[N];
- for (int i=0; i<N; i++) {
- result[i] = colGetEntry(i, offset);
- }
- return result;
- }
-
- @SuppressWarnings("unchecked")
- public <T> T[] toArrayHelper(T[] array, int offset) {
- final int N = colGetSize();
- if (array.length < N) {
- @SuppressWarnings("unchecked") T[] newArray
- = (T[]) Array.newInstance(array.getClass().getComponentType(), N);
- array = newArray;
- }
- for (int i=0; i<N; i++) {
- array[i] = (T)colGetEntry(i, offset);
- }
- if (array.length > N) {
- array[N] = null;
- }
- return array;
- }
-
- public static <T> boolean equalsSetHelper(Set<T> set, Object object) {
- if (set == object) {
- return true;
- }
- if (object instanceof Set) {
- Set<?> s = (Set<?>) object;
-
- try {
- return set.size() == s.size() && set.containsAll(s);
- } catch (NullPointerException ignored) {
- return false;
- } catch (ClassCastException ignored) {
- return false;
- }
- }
- return false;
- }
-
- public Set<Map.Entry<K, V>> getEntrySet() {
- if (mEntrySet == null) {
- mEntrySet = new EntrySet();
- }
- return mEntrySet;
- }
-
- public Set<K> getKeySet() {
- if (mKeySet == null) {
- mKeySet = new KeySet();
- }
- return mKeySet;
- }
-
- public Collection<V> getValues() {
- if (mValues == null) {
- mValues = new ValuesCollection();
- }
- return mValues;
- }
-
- protected abstract int colGetSize();
- protected abstract Object colGetEntry(int index, int offset);
- protected abstract int colIndexOfKey(Object key);
- protected abstract int colIndexOfValue(Object key);
- protected abstract Map<K, V> colGetMap();
- protected abstract void colPut(K key, V value);
- protected abstract V colSetValue(int index, V value);
- protected abstract void colRemoveAt(int index);
- protected abstract void colClear();
-}
diff --git a/collection/collection/src/main/java/androidx/collection/SimpleArrayMap.java b/collection/collection/src/main/java/androidx/collection/SimpleArrayMap.java
index 94824d6..c8e5dc73 100644
--- a/collection/collection/src/main/java/androidx/collection/SimpleArrayMap.java
+++ b/collection/collection/src/main/java/androidx/collection/SimpleArrayMap.java
@@ -683,13 +683,33 @@
if (this == object) {
return true;
}
- if (object instanceof SimpleArrayMap) {
- SimpleArrayMap<?, ?> map = (SimpleArrayMap<?, ?>) object;
- if (size() != map.size()) {
- return false;
- }
+ try {
+ if (object instanceof SimpleArrayMap) {
+ SimpleArrayMap<?, ?> map = (SimpleArrayMap<?, ?>) object;
+ if (size() != map.size()) {
+ return false;
+ }
- try {
+ for (int i=0; i<mSize; i++) {
+ K key = keyAt(i);
+ V mine = valueAt(i);
+ // TODO use index-based ops for this
+ Object theirs = map.get(key);
+ if (mine == null) {
+ if (theirs != null || !map.containsKey(key)) {
+ return false;
+ }
+ } else if (!mine.equals(theirs)) {
+ return false;
+ }
+ }
+ return true;
+ } else if (object instanceof Map) {
+ Map<?, ?> map = (Map<?, ?>) object;
+ if (size() != map.size()) {
+ return false;
+ }
+
for (int i=0; i<mSize; i++) {
K key = keyAt(i);
V mine = valueAt(i);
@@ -702,37 +722,10 @@
return false;
}
}
- } catch (NullPointerException ignored) {
- return false;
- } catch (ClassCastException ignored) {
- return false;
+ return true;
}
- return true;
- } else if (object instanceof Map) {
- Map<?, ?> map = (Map<?, ?>) object;
- if (size() != map.size()) {
- return false;
- }
-
- try {
- for (int i=0; i<mSize; i++) {
- K key = keyAt(i);
- V mine = valueAt(i);
- Object theirs = map.get(key);
- if (mine == null) {
- if (theirs != null || !map.containsKey(key)) {
- return false;
- }
- } else if (!mine.equals(theirs)) {
- return false;
- }
- }
- } catch (NullPointerException ignored) {
- return false;
- } catch (ClassCastException ignored) {
- return false;
- }
- return true;
+ } catch (NullPointerException ignored) {
+ } catch (ClassCastException ignored) {
}
return false;
}
diff --git a/collection/collection/src/test/java/androidx/collection/SimpleArrayMapTest.java b/collection/collection/src/test/java/androidx/collection/SimpleArrayMapTest.java
index 8faca32..66f5ea9 100644
--- a/collection/collection/src/test/java/androidx/collection/SimpleArrayMapTest.java
+++ b/collection/collection/src/test/java/androidx/collection/SimpleArrayMapTest.java
@@ -26,13 +26,59 @@
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
+import java.util.Collections;
import java.util.ConcurrentModificationException;
+import java.util.HashMap;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicBoolean;
@RunWith(JUnit4.class)
public class SimpleArrayMapTest {
@Test
+ @SuppressWarnings({"SimplifiableJUnitAssertion", "EqualsWithItself",
+ "EqualsBetweenInconvertibleTypes"})
+ public void equalsEmpty() {
+ SimpleArrayMap<String, String> empty = new SimpleArrayMap<>();
+
+ assertTrue(empty.equals(empty));
+ assertTrue(empty.equals(Collections.emptyMap()));
+ assertTrue(empty.equals(new SimpleArrayMap<String, String>()));
+ assertTrue(empty.equals(new HashMap<String, String>()));
+
+ assertFalse(empty.equals(Collections.singletonMap("foo", "bar")));
+
+ SimpleArrayMap<String, String> simpleArrayMapNotEmpty = new SimpleArrayMap<>();
+ simpleArrayMapNotEmpty.put("foo", "bar");
+ assertFalse(empty.equals(simpleArrayMapNotEmpty));
+
+ HashMap<String, String> hashMapNotEquals = new HashMap<>();
+ hashMapNotEquals.put("foo", "bar");
+ assertFalse(empty.equals(hashMapNotEquals));
+ }
+
+ @Test
+ @SuppressWarnings({"SimplifiableJUnitAssertion", "EqualsWithItself",
+ "EqualsBetweenInconvertibleTypes"})
+ public void equalsNonEmpty() {
+ SimpleArrayMap<String, String> map = new SimpleArrayMap<>();
+ map.put("foo", "bar");
+
+ assertTrue(map.equals(map));
+ assertTrue(map.equals(Collections.singletonMap("foo", "bar")));
+
+ SimpleArrayMap<String, String> otherSimpleArrayMap = new SimpleArrayMap<>();
+ otherSimpleArrayMap.put("foo", "bar");
+
+ HashMap<String, String> otherHashMap = new HashMap<>();
+ otherHashMap.put("foo", "bar");
+ assertTrue(map.equals(otherHashMap));
+
+ assertFalse(map.equals(Collections.emptyMap()));
+ assertFalse(map.equals(new SimpleArrayMap<String, String>()));
+ assertFalse(map.equals(new HashMap<String, String>()));
+ }
+
+ @Test
public void getOrDefaultPrefersStoredValue() {
SimpleArrayMap<String, String> map = new SimpleArrayMap<>();
map.put("one", "1");
diff --git a/core/core-ktx/api/1.4.0-alpha01.txt b/core/core-ktx/api/1.4.0-alpha01.txt
index d7b9bd6..1e105b2f 100644
--- a/core/core-ktx/api/1.4.0-alpha01.txt
+++ b/core/core-ktx/api/1.4.0-alpha01.txt
@@ -428,9 +428,13 @@
}
public final class PairKt {
+ method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
}
diff --git a/core/core-ktx/api/current.txt b/core/core-ktx/api/current.txt
index d7b9bd6..1e105b2f 100644
--- a/core/core-ktx/api/current.txt
+++ b/core/core-ktx/api/current.txt
@@ -428,9 +428,13 @@
}
public final class PairKt {
+ method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
}
diff --git a/core/core-ktx/api/public_plus_experimental_1.4.0-alpha01.txt b/core/core-ktx/api/public_plus_experimental_1.4.0-alpha01.txt
index d7b9bd6..1e105b2f 100644
--- a/core/core-ktx/api/public_plus_experimental_1.4.0-alpha01.txt
+++ b/core/core-ktx/api/public_plus_experimental_1.4.0-alpha01.txt
@@ -428,9 +428,13 @@
}
public final class PairKt {
+ method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
}
diff --git a/core/core-ktx/api/public_plus_experimental_current.txt b/core/core-ktx/api/public_plus_experimental_current.txt
index d7b9bd6..1e105b2f 100644
--- a/core/core-ktx/api/public_plus_experimental_current.txt
+++ b/core/core-ktx/api/public_plus_experimental_current.txt
@@ -428,9 +428,13 @@
}
public final class PairKt {
+ method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
}
diff --git a/core/core-ktx/api/restricted_1.4.0-alpha01.txt b/core/core-ktx/api/restricted_1.4.0-alpha01.txt
index d7b9bd6..1e105b2f 100644
--- a/core/core-ktx/api/restricted_1.4.0-alpha01.txt
+++ b/core/core-ktx/api/restricted_1.4.0-alpha01.txt
@@ -428,9 +428,13 @@
}
public final class PairKt {
+ method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
}
diff --git a/core/core-ktx/api/restricted_current.txt b/core/core-ktx/api/restricted_current.txt
index d7b9bd6..1e105b2f 100644
--- a/core/core-ktx/api/restricted_current.txt
+++ b/core/core-ktx/api/restricted_current.txt
@@ -428,9 +428,13 @@
}
public final class PairKt {
+ method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
}
diff --git a/core/core-ktx/src/androidTest/java/androidx/core/util/PairTest.kt b/core/core-ktx/src/androidTest/java/androidx/core/util/PairTest.kt
index beaf0be..4be680d 100644
--- a/core/core-ktx/src/androidTest/java/androidx/core/util/PairTest.kt
+++ b/core/core-ktx/src/androidTest/java/androidx/core/util/PairTest.kt
@@ -16,37 +16,64 @@
package androidx.core.util
-import android.util.Pair
import androidx.test.filters.SmallTest
import org.junit.Assert.assertEquals
import org.junit.Assert.assertSame
import org.junit.Test
+import android.util.Pair as AndroidPair
+import kotlin.Pair as KotlinPair
@SmallTest
class PairTest {
- @Test fun destructuringNonNull() {
+ @Test fun androidDestructuringNonNull() {
+ val pair = AndroidPair("one", "two")
+ val (first: String, second: String) = pair
+ assertSame(pair.first, first)
+ assertSame(pair.second, second)
+ }
+
+ @Test fun androidDestructuringNullable() {
+ val pair = AndroidPair("one", "two")
+ val (first: String?, second: String?) = pair
+ assertSame(pair.first, first)
+ assertSame(pair.second, second)
+ }
+
+ @Test fun androidToKotlin() {
+ val android = AndroidPair("one", "two")
+ val kotlin = android.toKotlinPair()
+ assertEquals(android.first to android.second, kotlin)
+ }
+
+ @Test fun kotlinToAndroid() {
+ val kotlin = KotlinPair("one", "two")
+ val android = kotlin.toAndroidPair()
+ assertEquals(AndroidPair(kotlin.first, kotlin.second), android)
+ }
+
+ @Test fun androidXDestructuringNonNull() {
val pair = Pair("one", "two")
val (first: String, second: String) = pair
assertSame(pair.first, first)
assertSame(pair.second, second)
}
- @Test fun destructuringNullable() {
+ @Test fun androidXDestructuringNullable() {
val pair = Pair("one", "two")
val (first: String?, second: String?) = pair
assertSame(pair.first, first)
assertSame(pair.second, second)
}
- @Test fun toKotlin() {
- val android = Pair("one", "two")
- val kotlin = android.toKotlinPair()
- assertEquals(android.first to android.second, kotlin)
+ @Test fun androidXToKotlin() {
+ val pair = Pair("one", "two")
+ val kotlin = pair.toKotlinPair()
+ assertEquals(pair.first to pair.second, kotlin)
}
- @Test fun toAndroid() {
- val kotlin = kotlin.Pair("one", "two")
- val android = kotlin.toAndroidPair()
- assertEquals(Pair(kotlin.first, kotlin.second), android)
+ @Test fun kotlinToAndroidX() {
+ val kotlin = KotlinPair("one", "two")
+ val pair = kotlin.toAndroidXPair()
+ assertEquals(Pair(kotlin.first, kotlin.second), pair)
}
}
diff --git a/core/core-ktx/src/main/java/androidx/core/util/Pair.kt b/core/core-ktx/src/main/java/androidx/core/util/Pair.kt
index 6cc40a4..be0d1ec 100644
--- a/core/core-ktx/src/main/java/androidx/core/util/Pair.kt
+++ b/core/core-ktx/src/main/java/androidx/core/util/Pair.kt
@@ -19,7 +19,8 @@
package androidx.core.util
import android.annotation.SuppressLint
-import android.util.Pair
+import android.util.Pair as AndroidPair
+import kotlin.Pair as KotlinPair
/**
* Returns the first component of the pair.
@@ -45,9 +46,40 @@
@Suppress("HasPlatformType") // Intentionally propagating platform type with unknown nullability.
inline operator fun <F, S> Pair<F, S>.component2() = second
-/** Returns this [Pair] as a [kotlin.Pair]. */
-inline fun <F, S> Pair<F, S>.toKotlinPair() = kotlin.Pair(first, second)
+/** Returns this [AndroidX `Pair`][Pair] as a [Kotlin `Pair`][KotlinPair]. */
+inline fun <F, S> Pair<F, S>.toKotlinPair() = KotlinPair(first, second)
-/** Returns this [kotlin.Pair] as an Android [Pair]. */
+/** Returns this [Kotlin `Pair`][KotlinPair] as an [AndroidX `Pair`][Pair]. */
// Note: the return type is explicitly specified here to prevent always seeing platform types.
-inline fun <F, S> kotlin.Pair<F, S>.toAndroidPair(): Pair<F, S> = Pair(first, second)
+inline fun <F, S> KotlinPair<F, S>.toAndroidXPair(): Pair<F, S> = Pair(first, second)
+
+/**
+ * Returns the first component of the pair.
+ *
+ * This method allows to use destructuring declarations when working with pairs, for example:
+ * ```
+ * val (first, second) = myPair
+ * ```
+ */
+@SuppressLint("UnknownNullness")
+@Suppress("HasPlatformType") // Intentionally propagating platform type with unknown nullability.
+inline operator fun <F, S> AndroidPair<F, S>.component1() = first
+
+/**
+ * Returns the second component of the pair.
+ *
+ * This method allows to use destructuring declarations when working with pairs, for example:
+ * ```
+ * val (first, second) = myPair
+ * ```
+ */
+@SuppressLint("UnknownNullness")
+@Suppress("HasPlatformType") // Intentionally propagating platform type with unknown nullability.
+inline operator fun <F, S> AndroidPair<F, S>.component2() = second
+
+/** Returns this [Android `Pair`][AndroidPair] as a [Kotlin `Pair`][KotlinPair]. */
+inline fun <F, S> AndroidPair<F, S>.toKotlinPair() = KotlinPair(first, second)
+
+/** Returns this [Kotlin `Pair`][KotlinPair] as an [Android `Pair`][AndroidPair]. */
+// Note: the return type is explicitly specified here to prevent always seeing platform types.
+inline fun <F, S> KotlinPair<F, S>.toAndroidPair(): AndroidPair<F, S> = AndroidPair(first, second)
diff --git a/core/core-role/src/main/java/androidx/core/role/RoleManagerCompat.java b/core/core-role/src/main/java/androidx/core/role/RoleManagerCompat.java
index fee2d79..38f250af 100644
--- a/core/core-role/src/main/java/androidx/core/role/RoleManagerCompat.java
+++ b/core/core-role/src/main/java/androidx/core/role/RoleManagerCompat.java
@@ -178,7 +178,8 @@
* <p>
* To qualify for this role, an application needs to implement
* {@link android.telecom.CallScreeningService}. The application will be able to screen calls
- * and provide call identification.
+ * and provide call identification. The application will also be able to display over other apps
+ * on Android 11 or above.
*
* @see android.telecom.CallScreeningService
*/
diff --git a/core/core/api/1.4.0-alpha01.ignore b/core/core/api/1.4.0-alpha01.ignore
new file mode 100644
index 0000000..1b58ddc
--- /dev/null
+++ b/core/core/api/1.4.0-alpha01.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+InvalidNullConversion: androidx.core.util.Pair#Pair(F, S) parameter #0:
+ Attempted to remove @Nullable annotation from parameter arg1 in androidx.core.util.Pair(F arg1, S arg2)
+InvalidNullConversion: androidx.core.util.Pair#Pair(F, S) parameter #1:
+ Attempted to remove @Nullable annotation from parameter arg2 in androidx.core.util.Pair(F arg1, S arg2)
+InvalidNullConversion: androidx.core.util.Pair#create(A, B) parameter #0:
+ Attempted to remove @Nullable annotation from parameter arg1 in androidx.core.util.Pair.create(A arg1, B arg2)
+InvalidNullConversion: androidx.core.util.Pair#create(A, B) parameter #1:
+ Attempted to remove @Nullable annotation from parameter arg2 in androidx.core.util.Pair.create(A arg1, B arg2)
+InvalidNullConversion: androidx.core.util.Pair#first:
+ Attempted to remove @Nullable annotation from field androidx.core.util.Pair.first
+InvalidNullConversion: androidx.core.util.Pair#second:
+ Attempted to remove @Nullable annotation from field androidx.core.util.Pair.second
diff --git a/core/core/api/1.4.0-alpha01.txt b/core/core/api/1.4.0-alpha01.txt
index dc6a8e1..aed9013f 100644
--- a/core/core/api/1.4.0-alpha01.txt
+++ b/core/core/api/1.4.0-alpha01.txt
@@ -1627,10 +1627,10 @@
}
public class Pair<F, S> {
- ctor public Pair(F?, S?);
- method public static <A, B> androidx.core.util.Pair<A!,B!> create(A?, B?);
- field public final F? first;
- field public final S? second;
+ ctor public Pair(F!, S!);
+ method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+ field public final F! first;
+ field public final S! second;
}
public final class PatternsCompat {
diff --git a/core/core/api/current.txt b/core/core/api/current.txt
index dc6a8e1..aed9013f 100644
--- a/core/core/api/current.txt
+++ b/core/core/api/current.txt
@@ -1627,10 +1627,10 @@
}
public class Pair<F, S> {
- ctor public Pair(F?, S?);
- method public static <A, B> androidx.core.util.Pair<A!,B!> create(A?, B?);
- field public final F? first;
- field public final S? second;
+ ctor public Pair(F!, S!);
+ method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+ field public final F! first;
+ field public final S! second;
}
public final class PatternsCompat {
diff --git a/core/core/api/public_plus_experimental_1.4.0-alpha01.txt b/core/core/api/public_plus_experimental_1.4.0-alpha01.txt
index bd9c3f4..47d0bac 100644
--- a/core/core/api/public_plus_experimental_1.4.0-alpha01.txt
+++ b/core/core/api/public_plus_experimental_1.4.0-alpha01.txt
@@ -1625,10 +1625,10 @@
}
public class Pair<F, S> {
- ctor public Pair(F?, S?);
- method public static <A, B> androidx.core.util.Pair<A!,B!> create(A?, B?);
- field public final F? first;
- field public final S? second;
+ ctor public Pair(F!, S!);
+ method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+ field public final F! first;
+ field public final S! second;
}
public final class PatternsCompat {
diff --git a/core/core/api/public_plus_experimental_current.txt b/core/core/api/public_plus_experimental_current.txt
index bd9c3f4..47d0bac 100644
--- a/core/core/api/public_plus_experimental_current.txt
+++ b/core/core/api/public_plus_experimental_current.txt
@@ -1625,10 +1625,10 @@
}
public class Pair<F, S> {
- ctor public Pair(F?, S?);
- method public static <A, B> androidx.core.util.Pair<A!,B!> create(A?, B?);
- field public final F? first;
- field public final S? second;
+ ctor public Pair(F!, S!);
+ method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+ field public final F! first;
+ field public final S! second;
}
public final class PatternsCompat {
diff --git a/core/core/api/restricted_1.4.0-alpha01.ignore b/core/core/api/restricted_1.4.0-alpha01.ignore
new file mode 100644
index 0000000..1b58ddc
--- /dev/null
+++ b/core/core/api/restricted_1.4.0-alpha01.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+InvalidNullConversion: androidx.core.util.Pair#Pair(F, S) parameter #0:
+ Attempted to remove @Nullable annotation from parameter arg1 in androidx.core.util.Pair(F arg1, S arg2)
+InvalidNullConversion: androidx.core.util.Pair#Pair(F, S) parameter #1:
+ Attempted to remove @Nullable annotation from parameter arg2 in androidx.core.util.Pair(F arg1, S arg2)
+InvalidNullConversion: androidx.core.util.Pair#create(A, B) parameter #0:
+ Attempted to remove @Nullable annotation from parameter arg1 in androidx.core.util.Pair.create(A arg1, B arg2)
+InvalidNullConversion: androidx.core.util.Pair#create(A, B) parameter #1:
+ Attempted to remove @Nullable annotation from parameter arg2 in androidx.core.util.Pair.create(A arg1, B arg2)
+InvalidNullConversion: androidx.core.util.Pair#first:
+ Attempted to remove @Nullable annotation from field androidx.core.util.Pair.first
+InvalidNullConversion: androidx.core.util.Pair#second:
+ Attempted to remove @Nullable annotation from field androidx.core.util.Pair.second
diff --git a/core/core/api/restricted_1.4.0-alpha01.txt b/core/core/api/restricted_1.4.0-alpha01.txt
index 98780fe..87243b9 100644
--- a/core/core/api/restricted_1.4.0-alpha01.txt
+++ b/core/core/api/restricted_1.4.0-alpha01.txt
@@ -1964,10 +1964,10 @@
}
public class Pair<F, S> {
- ctor public Pair(F?, S?);
- method public static <A, B> androidx.core.util.Pair<A!,B!> create(A?, B?);
- field public final F? first;
- field public final S? second;
+ ctor public Pair(F!, S!);
+ method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+ field public final F! first;
+ field public final S! second;
}
public final class PatternsCompat {
diff --git a/core/core/api/restricted_current.txt b/core/core/api/restricted_current.txt
index 98780fe..87243b9 100644
--- a/core/core/api/restricted_current.txt
+++ b/core/core/api/restricted_current.txt
@@ -1964,10 +1964,10 @@
}
public class Pair<F, S> {
- ctor public Pair(F?, S?);
- method public static <A, B> androidx.core.util.Pair<A!,B!> create(A?, B?);
- field public final F? first;
- field public final S? second;
+ ctor public Pair(F!, S!);
+ method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+ field public final F! first;
+ field public final S! second;
}
public final class PatternsCompat {
diff --git a/core/core/src/main/java/androidx/core/util/Pair.java b/core/core/src/main/java/androidx/core/util/Pair.java
index 61ea5d5..00840d5 100644
--- a/core/core/src/main/java/androidx/core/util/Pair.java
+++ b/core/core/src/main/java/androidx/core/util/Pair.java
@@ -17,7 +17,6 @@
package androidx.core.util;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
/**
* Container to ease passing around a tuple of two objects. This object provides a sensible
@@ -25,8 +24,8 @@
* objects.
*/
public class Pair<F, S> {
- public final @Nullable F first;
- public final @Nullable S second;
+ public final F first;
+ public final S second;
/**
* Constructor for a Pair.
@@ -34,7 +33,8 @@
* @param first the first object in the Pair
* @param second the second object in the pair
*/
- public Pair(@Nullable F first, @Nullable S second) {
+ @SuppressWarnings("UnknownNullness") // Generic nullness should come from type annotations.
+ public Pair(F first, S second) {
this.first = first;
this.second = second;
}
@@ -69,7 +69,7 @@
@NonNull
@Override
public String toString() {
- return "Pair{" + String.valueOf(first) + " " + String.valueOf(second) + "}";
+ return "Pair{" + first + " " + second + "}";
}
/**
@@ -79,7 +79,8 @@
* @return a Pair that is templatized with the types of a and b
*/
@NonNull
- public static <A, B> Pair <A, B> create(@Nullable A a, @Nullable B b) {
- return new Pair<A, B>(a, b);
+ @SuppressWarnings("UnknownNullness") // Generic nullness should come from type annotations.
+ public static <A, B> Pair<A, B> create(A a, B b) {
+ return new Pair<>(a, b);
}
}
diff --git a/fragment/fragment-ktx/api/1.3.0-alpha05.txt b/fragment/fragment-ktx/api/1.3.0-alpha05.txt
index 9a96cc8..7fc1d63 100644
--- a/fragment/fragment-ktx/api/1.3.0-alpha05.txt
+++ b/fragment/fragment-ktx/api/1.3.0-alpha05.txt
@@ -5,7 +5,7 @@
method public static void clearFragmentResult(androidx.fragment.app.Fragment, String requestKey);
method public static void clearFragmentResultListener(androidx.fragment.app.Fragment, String requestKey);
method public static void setFragmentResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle result);
- method public static void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentManagerKt {
@@ -15,7 +15,7 @@
}
public final class FragmentResultOwnerKt {
- method public static void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentTransactionKt {
diff --git a/fragment/fragment-ktx/api/current.txt b/fragment/fragment-ktx/api/current.txt
index 9a96cc8..7fc1d63 100644
--- a/fragment/fragment-ktx/api/current.txt
+++ b/fragment/fragment-ktx/api/current.txt
@@ -5,7 +5,7 @@
method public static void clearFragmentResult(androidx.fragment.app.Fragment, String requestKey);
method public static void clearFragmentResultListener(androidx.fragment.app.Fragment, String requestKey);
method public static void setFragmentResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle result);
- method public static void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentManagerKt {
@@ -15,7 +15,7 @@
}
public final class FragmentResultOwnerKt {
- method public static void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentTransactionKt {
diff --git a/fragment/fragment-ktx/api/public_plus_experimental_1.3.0-alpha05.txt b/fragment/fragment-ktx/api/public_plus_experimental_1.3.0-alpha05.txt
index 9a96cc8..7fc1d63 100644
--- a/fragment/fragment-ktx/api/public_plus_experimental_1.3.0-alpha05.txt
+++ b/fragment/fragment-ktx/api/public_plus_experimental_1.3.0-alpha05.txt
@@ -5,7 +5,7 @@
method public static void clearFragmentResult(androidx.fragment.app.Fragment, String requestKey);
method public static void clearFragmentResultListener(androidx.fragment.app.Fragment, String requestKey);
method public static void setFragmentResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle result);
- method public static void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentManagerKt {
@@ -15,7 +15,7 @@
}
public final class FragmentResultOwnerKt {
- method public static void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentTransactionKt {
diff --git a/fragment/fragment-ktx/api/public_plus_experimental_current.txt b/fragment/fragment-ktx/api/public_plus_experimental_current.txt
index 9a96cc8..7fc1d63 100644
--- a/fragment/fragment-ktx/api/public_plus_experimental_current.txt
+++ b/fragment/fragment-ktx/api/public_plus_experimental_current.txt
@@ -5,7 +5,7 @@
method public static void clearFragmentResult(androidx.fragment.app.Fragment, String requestKey);
method public static void clearFragmentResultListener(androidx.fragment.app.Fragment, String requestKey);
method public static void setFragmentResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle result);
- method public static void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentManagerKt {
@@ -15,7 +15,7 @@
}
public final class FragmentResultOwnerKt {
- method public static void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentTransactionKt {
diff --git a/fragment/fragment-ktx/api/restricted_1.3.0-alpha05.txt b/fragment/fragment-ktx/api/restricted_1.3.0-alpha05.txt
index 9a96cc8..7fc1d63 100644
--- a/fragment/fragment-ktx/api/restricted_1.3.0-alpha05.txt
+++ b/fragment/fragment-ktx/api/restricted_1.3.0-alpha05.txt
@@ -5,7 +5,7 @@
method public static void clearFragmentResult(androidx.fragment.app.Fragment, String requestKey);
method public static void clearFragmentResultListener(androidx.fragment.app.Fragment, String requestKey);
method public static void setFragmentResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle result);
- method public static void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentManagerKt {
@@ -15,7 +15,7 @@
}
public final class FragmentResultOwnerKt {
- method public static void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentTransactionKt {
diff --git a/fragment/fragment-ktx/api/restricted_current.txt b/fragment/fragment-ktx/api/restricted_current.txt
index 9a96cc8..7fc1d63 100644
--- a/fragment/fragment-ktx/api/restricted_current.txt
+++ b/fragment/fragment-ktx/api/restricted_current.txt
@@ -5,7 +5,7 @@
method public static void clearFragmentResult(androidx.fragment.app.Fragment, String requestKey);
method public static void clearFragmentResultListener(androidx.fragment.app.Fragment, String requestKey);
method public static void setFragmentResult(androidx.fragment.app.Fragment, String requestKey, android.os.Bundle result);
- method public static void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.Fragment, String requestKey, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentManagerKt {
@@ -15,7 +15,7 @@
}
public final class FragmentResultOwnerKt {
- method public static void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
+ method public static inline void setFragmentResultListener(androidx.fragment.app.FragmentResultOwner, String requestKey, androidx.lifecycle.LifecycleOwner lifecycleOwner, kotlin.jvm.functions.Function2<? super java.lang.String,? super android.os.Bundle,kotlin.Unit> listener);
}
public final class FragmentTransactionKt {
diff --git a/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTest.kt b/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTest.kt
index 65aa8d9..a545f2c 100644
--- a/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTest.kt
+++ b/fragment/fragment-ktx/src/androidTest/java/androidx/fragment/app/FragmentTest.kt
@@ -20,13 +20,13 @@
import androidx.core.os.bundleOf
import androidx.test.core.app.ActivityScenario
import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.filters.MediumTest
+import androidx.test.filters.LargeTest
import androidx.testutils.withActivity
import com.google.common.truth.Truth.assertWithMessage
import org.junit.Test
import org.junit.runner.RunWith
-@MediumTest
+@LargeTest
@RunWith(AndroidJUnit4::class)
class FragmentTest {
diff --git a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/Fragment.kt b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/Fragment.kt
index 91cdc98..45e9ff0 100644
--- a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/Fragment.kt
+++ b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/Fragment.kt
@@ -61,9 +61,9 @@
* @param listener listener for result changes or `null` to remove any previously
* registered listener.
*/
-fun Fragment.setFragmentResultListener(
+inline fun Fragment.setFragmentResultListener(
requestKey: String,
- listener: ((resultKey: String, bundle: Bundle) -> Unit)
+ crossinline listener: ((resultKey: String, bundle: Bundle) -> Unit)
) {
parentFragmentManager.setFragmentResultListener(requestKey, this, listener)
}
diff --git a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentResultOwner.kt b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentResultOwner.kt
index 9c102cb..efdae55 100644
--- a/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentResultOwner.kt
+++ b/fragment/fragment-ktx/src/main/java/androidx/fragment/app/FragmentResultOwner.kt
@@ -32,10 +32,11 @@
* @param listener listener for result changes or `null` to remove any previously registered
* listener.
*/
-fun FragmentResultOwner.setFragmentResultListener(
+inline fun FragmentResultOwner.setFragmentResultListener(
requestKey: String,
lifecycleOwner: LifecycleOwner,
- listener: ((resultKey: String, bundle: Bundle) -> Unit)
+ crossinline listener: ((resultKey: String, bundle: Bundle) -> Unit)
) {
- setFragmentResultListener(requestKey, lifecycleOwner, FragmentResultListener(listener))
+ setFragmentResultListener(requestKey, lifecycleOwner,
+ FragmentResultListener { resultKey, bundle -> listener.invoke(resultKey, bundle) })
}
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
index 79a9ec6..81d9482 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
@@ -182,8 +182,22 @@
}
/**
- * Alternate constructor that can be used to provide a default layout
- * that will be inflated by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
+ * Alternate constructor that can be called from your default, no argument constructor to
+ * provide a default layout that will be inflated by
+ * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
+ *
+ * <pre class="prettyprint">
+ * class MyDialogFragment extends DialogFragment {
+ * public MyDialogFragment() {
+ * super(R.layout.dialog_fragment_main);
+ * }
+ * }
+ * </pre>
+ *
+ * You must
+ * {@link FragmentManager#setFragmentFactory(FragmentFactory) set a custom FragmentFactory}
+ * if you want to use a non-default constructor to ensure that your constructor is called
+ * when the fragment is re-instantiated.
*
* @see #DialogFragment()
* @see #onCreateView(LayoutInflater, ViewGroup, Bundle)
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
index 0dcbdd1..f4f585e 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/Fragment.java
@@ -516,8 +516,22 @@
}
/**
- * Alternate constructor that can be used to provide a default layout
- * that will be inflated by {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
+ * Alternate constructor that can be called from your default, no argument constructor to
+ * provide a default layout that will be inflated by
+ * {@link #onCreateView(LayoutInflater, ViewGroup, Bundle)}.
+ *
+ * <pre class="prettyprint">
+ * class MyFragment extends Fragment {
+ * public MyFragment() {
+ * super(R.layout.fragment_main);
+ * }
+ * }
+ * </pre>
+ *
+ * You must
+ * {@link FragmentManager#setFragmentFactory(FragmentFactory) set a custom FragmentFactory}
+ * if you want to use a non-default constructor to ensure that your constructor is called
+ * when the fragment is re-instantiated.
*
* @see #Fragment()
* @see #onCreateView(LayoutInflater, ViewGroup, Bundle)
diff --git a/jetifier/jetifier/migration.config b/jetifier/jetifier/migration.config
index be1156a..c2cb71b 100644
--- a/jetifier/jetifier/migration.config
+++ b/jetifier/jetifier/migration.config
@@ -449,6 +449,10 @@
"to": "ignore"
},
{
+ "from": "androidx/collection/IndexBasedArrayIterator(.*)",
+ "to": "android/support/v4/util/IndexBasedArrayIterator{0}"
+ },
+ {
"from": "androidx/core/(.+)/(.+)Kt(.*)",
"to": "ignore"
},
diff --git a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/transform/metainf/MetaInfTransformer.kt b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/transform/metainf/MetaInfTransformer.kt
index f7f1f20..836ca6c 100644
--- a/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/transform/metainf/MetaInfTransformer.kt
+++ b/jetifier/jetifier/processor/src/main/kotlin/com/android/tools/build/jetifier/processor/transform/metainf/MetaInfTransformer.kt
@@ -47,7 +47,8 @@
"androidx.annotation_annotation-experimental.version",
"androidx.navigation_navigation-dynamic-features-fragment.version",
"androidx.navigation_navigation-dynamic-features-runtime.version",
- "androidx.navigation_navigation-testing.version"
+ "androidx.navigation_navigation-testing.version",
+ "androidx.savedstate_savedstate-ktx.version"
)
}
diff --git a/lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java b/lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
index cdcf327..a3ecdfd 100644
--- a/lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
+++ b/lifecycle/lifecycle-livedata-core/src/test/java/androidx/lifecycle/LiveDataTest.java
@@ -396,8 +396,8 @@
mLiveData.observe(mOwner, observer1);
mLiveData.observe(mOwner, observer2);
mLiveData.setValue("bla");
- verify(observer1, Mockito.atMost(2)).onChanged("gt");
- verify(observer2, Mockito.atMost(2)).onChanged("gt");
+ verify(observer1, Mockito.times(1)).onChanged("gt");
+ verify(observer2, Mockito.times(1)).onChanged("gt");
}
@Test
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/2.3.0-alpha03.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/2.3.0-alpha03.txt
index 63a3362..d1638a6 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/2.3.0-alpha03.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/2.3.0-alpha03.txt
@@ -10,6 +10,7 @@
public final class SavedStateHandle {
ctor public SavedStateHandle(java.util.Map<java.lang.String!,java.lang.Object!>);
ctor public SavedStateHandle();
+ method @MainThread public void clearSavedStateProvider(String);
method @MainThread public boolean contains(String);
method @MainThread public <T> T? get(String);
method @MainThread public <T> androidx.lifecycle.MutableLiveData<T!> getLiveData(String);
@@ -17,7 +18,7 @@
method @MainThread public java.util.Set<java.lang.String!> keys();
method @MainThread public <T> T? remove(String);
method @MainThread public <T> void set(String, T?);
- method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider?);
+ method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
}
public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
index 63a3362..d1638a6 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
@@ -10,6 +10,7 @@
public final class SavedStateHandle {
ctor public SavedStateHandle(java.util.Map<java.lang.String!,java.lang.Object!>);
ctor public SavedStateHandle();
+ method @MainThread public void clearSavedStateProvider(String);
method @MainThread public boolean contains(String);
method @MainThread public <T> T? get(String);
method @MainThread public <T> androidx.lifecycle.MutableLiveData<T!> getLiveData(String);
@@ -17,7 +18,7 @@
method @MainThread public java.util.Set<java.lang.String!> keys();
method @MainThread public <T> T? remove(String);
method @MainThread public <T> void set(String, T?);
- method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider?);
+ method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
}
public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_2.3.0-alpha03.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_2.3.0-alpha03.txt
index 63a3362..d1638a6 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_2.3.0-alpha03.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_2.3.0-alpha03.txt
@@ -10,6 +10,7 @@
public final class SavedStateHandle {
ctor public SavedStateHandle(java.util.Map<java.lang.String!,java.lang.Object!>);
ctor public SavedStateHandle();
+ method @MainThread public void clearSavedStateProvider(String);
method @MainThread public boolean contains(String);
method @MainThread public <T> T? get(String);
method @MainThread public <T> androidx.lifecycle.MutableLiveData<T!> getLiveData(String);
@@ -17,7 +18,7 @@
method @MainThread public java.util.Set<java.lang.String!> keys();
method @MainThread public <T> T? remove(String);
method @MainThread public <T> void set(String, T?);
- method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider?);
+ method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
}
public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
index 63a3362..d1638a6 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
@@ -10,6 +10,7 @@
public final class SavedStateHandle {
ctor public SavedStateHandle(java.util.Map<java.lang.String!,java.lang.Object!>);
ctor public SavedStateHandle();
+ method @MainThread public void clearSavedStateProvider(String);
method @MainThread public boolean contains(String);
method @MainThread public <T> T? get(String);
method @MainThread public <T> androidx.lifecycle.MutableLiveData<T!> getLiveData(String);
@@ -17,7 +18,7 @@
method @MainThread public java.util.Set<java.lang.String!> keys();
method @MainThread public <T> T? remove(String);
method @MainThread public <T> void set(String, T?);
- method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider?);
+ method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
}
public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_2.3.0-alpha03.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_2.3.0-alpha03.txt
index 7f9eabe8..ec77411 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_2.3.0-alpha03.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_2.3.0-alpha03.txt
@@ -11,6 +11,7 @@
public final class SavedStateHandle {
ctor public SavedStateHandle(java.util.Map<java.lang.String!,java.lang.Object!>);
ctor public SavedStateHandle();
+ method @MainThread public void clearSavedStateProvider(String);
method @MainThread public boolean contains(String);
method @MainThread public <T> T? get(String);
method @MainThread public <T> androidx.lifecycle.MutableLiveData<T!> getLiveData(String);
@@ -18,7 +19,7 @@
method @MainThread public java.util.Set<java.lang.String!> keys();
method @MainThread public <T> T? remove(String);
method @MainThread public <T> void set(String, T?);
- method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider?);
+ method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
}
public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
index 7f9eabe8..ec77411 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/restricted_current.txt
@@ -11,6 +11,7 @@
public final class SavedStateHandle {
ctor public SavedStateHandle(java.util.Map<java.lang.String!,java.lang.Object!>);
ctor public SavedStateHandle();
+ method @MainThread public void clearSavedStateProvider(String);
method @MainThread public boolean contains(String);
method @MainThread public <T> T? get(String);
method @MainThread public <T> androidx.lifecycle.MutableLiveData<T!> getLiveData(String);
@@ -18,7 +19,7 @@
method @MainThread public java.util.Set<java.lang.String!> keys();
method @MainThread public <T> T? remove(String);
method @MainThread public <T> void set(String, T?);
- method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider?);
+ method @MainThread public void setSavedStateProvider(String, androidx.savedstate.SavedStateRegistry.SavedStateProvider);
}
public final class SavedStateViewModelFactory implements androidx.lifecycle.ViewModelProvider.Factory {
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleProviderTest.kt b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleProviderTest.kt
index 22401af..9dc49ff 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleProviderTest.kt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/androidTest/java/androidx/lifecycle/SavedStateHandleProviderTest.kt
@@ -66,7 +66,7 @@
}
}
// Now reset the SavedStateProvider
- handle.setSavedStateProvider("provider", null)
+ handle.clearSavedStateProvider("provider")
// Now save the state
handle.savedStateProvider().saveState()
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
index 79b7e24..e5f903f 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
+++ b/lifecycle/lifecycle-viewmodel-savedstate/src/main/java/androidx/lifecycle/SavedStateHandle.java
@@ -316,17 +316,25 @@
*
* @param key a key which will populated with a {@link Bundle} produced by the provider
* @param provider a SavedStateProvider which will receive a callback to
- * {@link SavedStateProvider#saveState()} when the state should be saved or null to remove a
- * previously set SavedStateProvider
+ * {@link SavedStateProvider#saveState()} when the state should be saved
*/
@MainThread
- public void setSavedStateProvider(@NonNull String key,
- @Nullable SavedStateProvider provider) {
- if (provider != null) {
- mSavedStateProviders.put(key, provider);
- } else {
+ public void setSavedStateProvider(@NonNull String key, @NonNull SavedStateProvider provider) {
+ mSavedStateProviders.put(key, provider);
+ }
+
+ /**
+ * Clear any {@link SavedStateProvider} that was previously set via
+ * {@link #setSavedStateProvider(String, SavedStateProvider)}.
+ *
+ * Note: calling this method within {@link SavedStateProvider#saveState()} is supported, but
+ * will only affect future state saving operations.
+ *
+ * @param key a key previously used with {@link #setSavedStateProvider}
+ */
+ @MainThread
+ public void clearSavedStateProvider(@NonNull String key) {
mSavedStateProviders.remove(key);
- }
}
static class SavingStateLiveData<T> extends MutableLiveData<T> {
diff --git a/lint-demos/lint-demo-appcompat/src/main/java/com/example/android/appcompat/AppCompatLintDemo.java b/lint-demos/lint-demo-appcompat/src/main/java/com/example/android/appcompat/AppCompatLintDemo.java
index 09050b4a..d633875 100644
--- a/lint-demos/lint-demo-appcompat/src/main/java/com/example/android/appcompat/AppCompatLintDemo.java
+++ b/lint-demos/lint-demo-appcompat/src/main/java/com/example/android/appcompat/AppCompatLintDemo.java
@@ -23,6 +23,7 @@
import android.os.Bundle;
import android.widget.Switch;
import android.widget.TextView;
+import android.widget.Toolbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.content.res.AppCompatResources;
@@ -66,5 +67,10 @@
// The following usage of the core Switch widget should be flagged by our Lint rule
Switch mySwitch = new Switch(this);
mySwitch.setChecked(true);
+
+ if (Build.VERSION.SDK_INT >= 21) {
+ // The following call should be flagged since we're extending AppCompatActivity
+ setActionBar(new Toolbar(this));
+ }
}
}
diff --git a/lint-demos/lint-demo-appcompat/src/main/java/com/example/android/appcompat/AppCompatLintDemoExt.java b/lint-demos/lint-demo-appcompat/src/main/java/com/example/android/appcompat/AppCompatLintDemoExt.java
new file mode 100644
index 0000000..72ea43d
--- /dev/null
+++ b/lint-demos/lint-demo-appcompat/src/main/java/com/example/android/appcompat/AppCompatLintDemoExt.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2013 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.appcompat;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.widget.Toolbar;
+
+/**
+ * Dummy extension activity for the AppCompat Lint demo
+ */
+public class AppCompatLintDemoExt extends AppCompatLintDemo {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (Build.VERSION.SDK_INT >= 21) {
+ // The following call should be flagged since we're extending AppCompatActivity
+ setActionBar(new Toolbar(this));
+ }
+ }
+}
diff --git a/lint-demos/lint-demo-appcompat/src/main/java/com/example/android/appcompat/CoreActivityExt.java b/lint-demos/lint-demo-appcompat/src/main/java/com/example/android/appcompat/CoreActivityExt.java
new file mode 100644
index 0000000..8bb6903
--- /dev/null
+++ b/lint-demos/lint-demo-appcompat/src/main/java/com/example/android/appcompat/CoreActivityExt.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2013 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.appcompat;
+
+import android.app.Activity;
+import android.os.Build;
+import android.os.Bundle;
+import android.widget.Toolbar;
+
+/**
+ * Dummy extension activity for the AppCompat Lint demo
+ */
+public class CoreActivityExt extends Activity {
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ if (Build.VERSION.SDK_INT >= 21) {
+ // The following call should not be flagged since we're extending Activity
+ setActionBar(new Toolbar(this));
+ }
+ }
+}
diff --git a/lint-demos/lint-demo-appcompat/src/main/res/layout-v23/text_view_using_android_compound_drawables.xml b/lint-demos/lint-demo-appcompat/src/main/res/layout-v23/text_view_using_android_compound_drawables.xml
index df63721..802cd7b 100644
--- a/lint-demos/lint-demo-appcompat/src/main/res/layout-v23/text_view_using_android_compound_drawables.xml
+++ b/lint-demos/lint-demo-appcompat/src/main/res/layout-v23/text_view_using_android_compound_drawables.xml
@@ -30,7 +30,7 @@
app:drawableTintMode="src_in" />
<TextView
- android:id="@+id/dummy"
+ android:id="@+id/dummy2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableStart="@drawable/app_sample_code"
diff --git a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ArcMotionUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ArcMotionUsage.java
index e8fa14e..7f4a952 100644
--- a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ArcMotionUsage.java
+++ b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ArcMotionUsage.java
@@ -21,6 +21,7 @@
import android.view.View;
import android.widget.FrameLayout;
+import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
import androidx.transition.ArcMotion;
import androidx.transition.ChangeBounds;
import androidx.transition.Transition;
diff --git a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeColor.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeColor.java
index 5bba2a1..19f6041 100644
--- a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeColor.java
+++ b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeColor.java
@@ -16,6 +16,9 @@
package com.example.android.support.transition.widget;
+import android.animation.Animator;
+import android.animation.ArgbEvaluator;
+import android.animation.ValueAnimator;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;
@@ -23,9 +26,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.ArgbEvaluator;
-import androidx.core.animation.ValueAnimator;
import androidx.transition.Transition;
import androidx.transition.TransitionValues;
@@ -64,8 +64,8 @@
@Nullable
@Override
public Animator createAnimator(@NonNull ViewGroup sceneRoot,
- @Nullable TransitionValues startValues,
- @Nullable TransitionValues endValues) {
+ @Nullable TransitionValues startValues,
+ @Nullable TransitionValues endValues) {
// This transition can only be applied to views that are on both starting and ending scenes.
if (null == startValues || null == endValues) {
return null;
@@ -91,13 +91,13 @@
// animation runs on the UI thread. The Evaluator controls what type of
// interpolation is done. In this case, an ArgbEvaluator interpolates between two
// #argb values, which are specified as the 2nd and 3rd input arguments.
- ValueAnimator animator = ValueAnimator.ofObject(ArgbEvaluator.getInstance(),
+ ValueAnimator animator = ValueAnimator.ofObject(new ArgbEvaluator(),
startColor.getColor(), endColor.getColor());
// Add an update listener to the Animator object.
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
- public void onAnimationUpdate(@NonNull Animator animation) {
- Object value = ((ValueAnimator) animation).getAnimatedValue();
+ public void onAnimationUpdate(ValueAnimator animation) {
+ Object value = animation.getAnimatedValue();
// Each time the ValueAnimator produces a new frame in the animation, change
// the background color of the target. Ensure that the value isn't null.
if (null != value) {
diff --git a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeTransformUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeTransformUsage.java
index f3c94e0..6761f59 100644
--- a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeTransformUsage.java
+++ b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/ChangeTransformUsage.java
@@ -22,6 +22,7 @@
import android.widget.FrameLayout;
import android.widget.LinearLayout;
+import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
import androidx.transition.ArcMotion;
import androidx.transition.ChangeTransform;
import androidx.transition.TransitionManager;
diff --git a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java
index 1d6a8b0..fa7016a 100644
--- a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java
+++ b/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/FragmentTransitionUsage.java
@@ -25,6 +25,7 @@
import androidx.core.view.ViewCompat;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
+import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
import androidx.transition.AutoTransition;
import androidx.transition.Fade;
import androidx.transition.Transition;
diff --git a/savedstate/savedstate-ktx/api/1.1.0-alpha01.txt b/savedstate/savedstate-ktx/api/1.1.0-alpha01.txt
new file mode 100644
index 0000000..5950b3f
--- /dev/null
+++ b/savedstate/savedstate-ktx/api/1.1.0-alpha01.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.savedstate {
+
+ public final class ViewKt {
+ method public static androidx.savedstate.SavedStateRegistryOwner? findViewTreeSavedStateRegistryOwner(android.view.View);
+ }
+
+}
+
diff --git a/savedstate/savedstate-ktx/api/current.txt b/savedstate/savedstate-ktx/api/current.txt
new file mode 100644
index 0000000..5950b3f
--- /dev/null
+++ b/savedstate/savedstate-ktx/api/current.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.savedstate {
+
+ public final class ViewKt {
+ method public static androidx.savedstate.SavedStateRegistryOwner? findViewTreeSavedStateRegistryOwner(android.view.View);
+ }
+
+}
+
diff --git a/savedstate/savedstate-ktx/api/public_plus_experimental_1.1.0-alpha01.txt b/savedstate/savedstate-ktx/api/public_plus_experimental_1.1.0-alpha01.txt
new file mode 100644
index 0000000..5950b3f
--- /dev/null
+++ b/savedstate/savedstate-ktx/api/public_plus_experimental_1.1.0-alpha01.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.savedstate {
+
+ public final class ViewKt {
+ method public static androidx.savedstate.SavedStateRegistryOwner? findViewTreeSavedStateRegistryOwner(android.view.View);
+ }
+
+}
+
diff --git a/savedstate/savedstate-ktx/api/public_plus_experimental_current.txt b/savedstate/savedstate-ktx/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..5950b3f
--- /dev/null
+++ b/savedstate/savedstate-ktx/api/public_plus_experimental_current.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.savedstate {
+
+ public final class ViewKt {
+ method public static androidx.savedstate.SavedStateRegistryOwner? findViewTreeSavedStateRegistryOwner(android.view.View);
+ }
+
+}
+
diff --git a/transition/transition-ktx/api/res-2.0.0-alpha01.txt b/savedstate/savedstate-ktx/api/res-1.1.0-alpha01.txt
similarity index 100%
rename from transition/transition-ktx/api/res-2.0.0-alpha01.txt
rename to savedstate/savedstate-ktx/api/res-1.1.0-alpha01.txt
diff --git a/transition/transition-ktx/api/res-2.0.0-alpha01.txt b/savedstate/savedstate-ktx/api/res-current.txt
similarity index 100%
copy from transition/transition-ktx/api/res-2.0.0-alpha01.txt
copy to savedstate/savedstate-ktx/api/res-current.txt
diff --git a/savedstate/savedstate-ktx/api/restricted_1.1.0-alpha01.txt b/savedstate/savedstate-ktx/api/restricted_1.1.0-alpha01.txt
new file mode 100644
index 0000000..5950b3f
--- /dev/null
+++ b/savedstate/savedstate-ktx/api/restricted_1.1.0-alpha01.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.savedstate {
+
+ public final class ViewKt {
+ method public static androidx.savedstate.SavedStateRegistryOwner? findViewTreeSavedStateRegistryOwner(android.view.View);
+ }
+
+}
+
diff --git a/savedstate/savedstate-ktx/api/restricted_current.txt b/savedstate/savedstate-ktx/api/restricted_current.txt
new file mode 100644
index 0000000..5950b3f
--- /dev/null
+++ b/savedstate/savedstate-ktx/api/restricted_current.txt
@@ -0,0 +1,9 @@
+// Signature format: 3.0
+package androidx.savedstate {
+
+ public final class ViewKt {
+ method public static androidx.savedstate.SavedStateRegistryOwner? findViewTreeSavedStateRegistryOwner(android.view.View);
+ }
+
+}
+
diff --git a/savedstate/savedstate-ktx/build.gradle b/savedstate/savedstate-ktx/build.gradle
new file mode 100644
index 0000000..a9a9736
--- /dev/null
+++ b/savedstate/savedstate-ktx/build.gradle
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+
+import static androidx.build.dependencies.DependenciesKt.*
+import androidx.build.LibraryGroups
+import androidx.build.Publish
+
+plugins {
+ id("AndroidXPlugin")
+ id("com.android.library")
+ id("org.jetbrains.kotlin.android")
+}
+
+android {
+ buildTypes {
+ debug {
+ testCoverageEnabled = false // Breaks Kotlin compiler.
+ }
+ }
+}
+
+dependencies {
+ api(project(":savedstate:savedstate"))
+ api(KOTLIN_STDLIB)
+
+ androidTestImplementation(TRUTH)
+ androidTestImplementation(ANDROIDX_TEST_EXT_JUNIT)
+ androidTestImplementation(ANDROIDX_TEST_CORE)
+ androidTestImplementation(ANDROIDX_TEST_RUNNER)
+}
+
+androidx {
+ name = "SavedState Kotlin Extensions"
+ publish = Publish.SNAPSHOT_AND_RELEASE
+ mavenGroup = LibraryGroups.SAVEDSTATE
+ inceptionYear = "2020"
+ description = "Kotlin extensions for 'savedstate' artifact"
+}
diff --git a/savedstate/savedstate-ktx/src/androidTest/java/androidx/savedstate/ViewTreeSavedStateRegistryOwnerTest.kt b/savedstate/savedstate-ktx/src/androidTest/java/androidx/savedstate/ViewTreeSavedStateRegistryOwnerTest.kt
new file mode 100644
index 0000000..3bcad0c
--- /dev/null
+++ b/savedstate/savedstate-ktx/src/androidTest/java/androidx/savedstate/ViewTreeSavedStateRegistryOwnerTest.kt
@@ -0,0 +1,126 @@
+/*
+ * 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.savedstate
+
+import android.view.View
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.lifecycle.Lifecycle
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertWithMessage
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class ViewTreeSavedStateRegistryOwnerTest {
+ /**
+ * Tests that a direct set/get on a single view survives a round trip
+ */
+ @Test
+ fun setGetSameView() {
+ val v = View(InstrumentationRegistry.getInstrumentation().context)
+
+ assertWithMessage("initial SavedStateRegistryOwner expects null")
+ .that(v.findViewTreeSavedStateRegistryOwner())
+ .isNull()
+
+ val dummyOwner: SavedStateRegistryOwner = DummySavedStateRegistryOwner()
+ ViewTreeSavedStateRegistryOwner.set(v, dummyOwner)
+
+ assertWithMessage("get the SavedStateRegistryOwner set directly")
+ .that(v.findViewTreeSavedStateRegistryOwner())
+ .isEqualTo(dummyOwner)
+ }
+
+ /**
+ * Tests that the owner set on a root of a subhierarchy is seen by both direct children
+ * and other descendants
+ */
+ @Test
+ fun getAncestorOwner() {
+ val context = InstrumentationRegistry.getInstrumentation().context
+ val root: ViewGroup = FrameLayout(context)
+ val parent: ViewGroup = FrameLayout(context)
+ val child = View(context)
+ root.addView(parent)
+ parent.addView(child)
+
+ assertWithMessage("initial SavedStateRegistryOwner expects null")
+ .that(child.findViewTreeSavedStateRegistryOwner())
+ .isNull()
+
+ val dummyOwner: SavedStateRegistryOwner = DummySavedStateRegistryOwner()
+ ViewTreeSavedStateRegistryOwner.set(root, dummyOwner)
+
+ assertWithMessage("root sees owner")
+ .that(root.findViewTreeSavedStateRegistryOwner())
+ .isEqualTo(dummyOwner)
+ assertWithMessage("direct child sees owner")
+ .that(parent.findViewTreeSavedStateRegistryOwner())
+ .isEqualTo(dummyOwner)
+ assertWithMessage("grandchild sees owner")
+ .that(child.findViewTreeSavedStateRegistryOwner())
+ .isEqualTo(dummyOwner)
+ }
+
+ /**
+ * Tests that a new owner set between a root and a descendant is seen by the descendant
+ * instead of the root value
+ */
+ @Test
+ fun shadowedOwner() {
+ val context =
+ InstrumentationRegistry.getInstrumentation().context
+ val root: ViewGroup = FrameLayout(context)
+ val parent: ViewGroup = FrameLayout(context)
+ val child = View(context)
+ root.addView(parent)
+ parent.addView(child)
+
+ assertWithMessage("initial SavedStateRegistryOwner expects null")
+ .that(child.findViewTreeSavedStateRegistryOwner())
+ .isNull()
+
+ val rootDummyOwner: SavedStateRegistryOwner = DummySavedStateRegistryOwner()
+ ViewTreeSavedStateRegistryOwner.set(root, rootDummyOwner)
+
+ val parentDummyOwner: SavedStateRegistryOwner = DummySavedStateRegistryOwner()
+ ViewTreeSavedStateRegistryOwner.set(parent, parentDummyOwner)
+
+ assertWithMessage("root sees owner")
+ .that(root.findViewTreeSavedStateRegistryOwner())
+ .isEqualTo(rootDummyOwner)
+ assertWithMessage("direct child sees owner")
+ .that(parent.findViewTreeSavedStateRegistryOwner())
+ .isEqualTo(parentDummyOwner)
+ assertWithMessage("grandchild sees owner")
+ .that(child.findViewTreeSavedStateRegistryOwner())
+ .isEqualTo(parentDummyOwner)
+ }
+
+ internal class DummySavedStateRegistryOwner : SavedStateRegistryOwner {
+ override fun getLifecycle(): Lifecycle {
+ throw UnsupportedOperationException("not a real SavedStateRegistryOwner")
+ }
+
+ override fun getSavedStateRegistry(): SavedStateRegistry {
+ throw UnsupportedOperationException("not a real SavedStateRegistryOwner")
+ }
+ }
+}
diff --git a/savedstate/savedstate-ktx/src/main/AndroidManifest.xml b/savedstate/savedstate-ktx/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..1ffcdaf
--- /dev/null
+++ b/savedstate/savedstate-ktx/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 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.
+-->
+<manifest package="androidx.savedstate.ktx"/>
diff --git a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/FastOutSlowInInterpolator.java b/savedstate/savedstate-ktx/src/main/java/androidx/savedstate/View.kt
similarity index 63%
rename from samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/FastOutSlowInInterpolator.java
rename to savedstate/savedstate-ktx/src/main/java/androidx/savedstate/View.kt
index 6cf5ba4..0345b8f 100644
--- a/samples/SupportTransitionDemos/src/main/java/com/example/android/support/transition/widget/FastOutSlowInInterpolator.java
+++ b/savedstate/savedstate-ktx/src/main/java/androidx/savedstate/View.kt
@@ -14,13 +14,13 @@
* limitations under the License.
*/
-package com.example.android.support.transition.widget;
+package androidx.savedstate
-import androidx.core.animation.PathInterpolator;
+import android.view.View
-class FastOutSlowInInterpolator extends PathInterpolator {
-
- FastOutSlowInInterpolator() {
- super(0.4f, 0f, 0.2f, 1f);
- }
-}
+/**
+ * Locates the [SavedStateRegistryOwner] associated with this [View], if present.
+ * This may be used to save and restore the state associated with this view.
+ */
+fun View.findViewTreeSavedStateRegistryOwner(): SavedStateRegistryOwner? =
+ ViewTreeSavedStateRegistryOwner.get(this)
diff --git a/savedstate/savedstate/api/1.1.0-alpha01.txt b/savedstate/savedstate/api/1.1.0-alpha01.txt
index 9e599d6..e11a77c 100644
--- a/savedstate/savedstate/api/1.1.0-alpha01.txt
+++ b/savedstate/savedstate/api/1.1.0-alpha01.txt
@@ -28,7 +28,7 @@
method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
}
- public class ViewTreeSavedStateRegistryOwner {
+ public final class ViewTreeSavedStateRegistryOwner {
method public static androidx.savedstate.SavedStateRegistryOwner? get(android.view.View);
method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner?);
}
diff --git a/savedstate/savedstate/api/current.txt b/savedstate/savedstate/api/current.txt
index 9e599d6..e11a77c 100644
--- a/savedstate/savedstate/api/current.txt
+++ b/savedstate/savedstate/api/current.txt
@@ -28,7 +28,7 @@
method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
}
- public class ViewTreeSavedStateRegistryOwner {
+ public final class ViewTreeSavedStateRegistryOwner {
method public static androidx.savedstate.SavedStateRegistryOwner? get(android.view.View);
method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner?);
}
diff --git a/savedstate/savedstate/api/public_plus_experimental_1.1.0-alpha01.txt b/savedstate/savedstate/api/public_plus_experimental_1.1.0-alpha01.txt
index 9e599d6..e11a77c 100644
--- a/savedstate/savedstate/api/public_plus_experimental_1.1.0-alpha01.txt
+++ b/savedstate/savedstate/api/public_plus_experimental_1.1.0-alpha01.txt
@@ -28,7 +28,7 @@
method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
}
- public class ViewTreeSavedStateRegistryOwner {
+ public final class ViewTreeSavedStateRegistryOwner {
method public static androidx.savedstate.SavedStateRegistryOwner? get(android.view.View);
method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner?);
}
diff --git a/savedstate/savedstate/api/public_plus_experimental_current.txt b/savedstate/savedstate/api/public_plus_experimental_current.txt
index 9e599d6..e11a77c 100644
--- a/savedstate/savedstate/api/public_plus_experimental_current.txt
+++ b/savedstate/savedstate/api/public_plus_experimental_current.txt
@@ -28,7 +28,7 @@
method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
}
- public class ViewTreeSavedStateRegistryOwner {
+ public final class ViewTreeSavedStateRegistryOwner {
method public static androidx.savedstate.SavedStateRegistryOwner? get(android.view.View);
method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner?);
}
diff --git a/savedstate/savedstate/api/restricted_1.1.0-alpha01.txt b/savedstate/savedstate/api/restricted_1.1.0-alpha01.txt
index 9e599d6..e11a77c 100644
--- a/savedstate/savedstate/api/restricted_1.1.0-alpha01.txt
+++ b/savedstate/savedstate/api/restricted_1.1.0-alpha01.txt
@@ -28,7 +28,7 @@
method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
}
- public class ViewTreeSavedStateRegistryOwner {
+ public final class ViewTreeSavedStateRegistryOwner {
method public static androidx.savedstate.SavedStateRegistryOwner? get(android.view.View);
method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner?);
}
diff --git a/savedstate/savedstate/api/restricted_current.txt b/savedstate/savedstate/api/restricted_current.txt
index 9e599d6..e11a77c 100644
--- a/savedstate/savedstate/api/restricted_current.txt
+++ b/savedstate/savedstate/api/restricted_current.txt
@@ -28,7 +28,7 @@
method public androidx.savedstate.SavedStateRegistry getSavedStateRegistry();
}
- public class ViewTreeSavedStateRegistryOwner {
+ public final class ViewTreeSavedStateRegistryOwner {
method public static androidx.savedstate.SavedStateRegistryOwner? get(android.view.View);
method public static void set(android.view.View, androidx.savedstate.SavedStateRegistryOwner?);
}
diff --git a/savedstate/savedstate/src/main/java/androidx/savedstate/ViewTreeSavedStateRegistryOwner.java b/savedstate/savedstate/src/main/java/androidx/savedstate/ViewTreeSavedStateRegistryOwner.java
index 6c08ad7..e82e908 100644
--- a/savedstate/savedstate/src/main/java/androidx/savedstate/ViewTreeSavedStateRegistryOwner.java
+++ b/savedstate/savedstate/src/main/java/androidx/savedstate/ViewTreeSavedStateRegistryOwner.java
@@ -26,7 +26,7 @@
* Accessors for finding a view tree-local {@link SavedStateRegistryOwner} that allows managing the
* saving state using {@link SavedStateRegistry} for the given view.
*/
-public class ViewTreeSavedStateRegistryOwner {
+public final class ViewTreeSavedStateRegistryOwner {
private ViewTreeSavedStateRegistryOwner() {
// No instances
}
@@ -36,6 +36,9 @@
* given {@link View}.
* Calls to {@link #get(View)} from this view or descendants will return {@code owner}.
*
+ * This is is automatically set for you in the common cases of using fragments or
+ * ComponentActivity.
+ *
* <p>This should only be called by constructs such as activities or fragments that manage
* a view tree and their saved state through a {@link SavedStateRegistryOwner}. Callers
* should only set a {@link SavedStateRegistryOwner} that will be <em>stable.</em> The
@@ -55,6 +58,9 @@
* for the given {@link View}.
* This may be used to save or restore the state associated with the view.
*
+ * The returned {@link SavedStateRegistryOwner} is managing all the Views within the Fragment
+ * or Activity the given {@link View} is added to.
+ *
* @param view View to fetch a {@link SavedStateRegistryOwner} for
* @return The {@link SavedStateRegistryOwner} responsible for managing the saved state for
* the given view and/or some subset of its ancestors
diff --git a/security/crypto/src/main/java/androidx/security/crypto/EncryptedFile.java b/security/crypto/src/main/java/androidx/security/crypto/EncryptedFile.java
index 77eddfe..8170241 100644
--- a/security/crypto/src/main/java/androidx/security/crypto/EncryptedFile.java
+++ b/security/crypto/src/main/java/androidx/security/crypto/EncryptedFile.java
@@ -92,12 +92,12 @@
*/
public enum FileEncryptionScheme {
/**
- * The file content is encrypted using {@link StreamingAead} with AES-GCM, with the
+ * The file content is encrypted using <a href="https://google.github.io/tink/javadoc/tink/1.3.0/com/google/crypto/tink/streamingaead/StreamingAead.html">StreamingAead</a> with AES-GCM, with the
* file name as associated data.
*
* For more information please see the Tink documentation:
*
- * {@link StreamingAeadKeyTemplates}.AES256_GCM_HKDF_4KB
+ * <a href="https://google.github.io/tink/javadoc/tink/1.3.0/com/google/crypto/tink/streamingaead/StreamingAeadKeyTemplates.html">StreamingAeadKeyTemplates</a>.AES256_GCM_HKDF_4KB
*/
AES256_GCM_HKDF_4KB(StreamingAeadKeyTemplates.AES256_GCM_HKDF_4KB);
diff --git a/security/crypto/src/main/java/androidx/security/crypto/EncryptedSharedPreferences.java b/security/crypto/src/main/java/androidx/security/crypto/EncryptedSharedPreferences.java
index e65cd68..c627a0a 100644
--- a/security/crypto/src/main/java/androidx/security/crypto/EncryptedSharedPreferences.java
+++ b/security/crypto/src/main/java/androidx/security/crypto/EncryptedSharedPreferences.java
@@ -141,7 +141,7 @@
*
* For more information please see the Tink documentation:
*
- * {@link DeterministicAeadKeyTemplates}.AES256_SIV
+ * <a href="https://google.github.io/tink/javadoc/tink/1.3.0/com/google/crypto/tink/daead/DeterministicAeadKeyTemplates.html">DeterministicAeadKeyTemplates</a>.AES256_SIV
*/
AES256_SIV(DeterministicAeadKeyTemplates.AES256_SIV);
@@ -165,7 +165,7 @@
*
* For more information please see the Tink documentation:
*
- * {@link AeadKeyTemplates}.AES256_GCM
+ * <a href="https://google.github.io/tink/javadoc/tink/1.3.0/com/google/crypto/tink/aead/AeadKeyTemplates.html">AeadKeyTemplates</a>.AES256_GCM
*/
AES256_GCM(AeadKeyTemplates.AES256_GCM);
diff --git a/settings.gradle b/settings.gradle
index 1939dd9..a987294 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -261,6 +261,7 @@
includeProject(":versionedparcelable:versionedparcelable-annotation", "versionedparcelable/annotation")
includeProject(":versionedparcelable:versionedparcelable", "versionedparcelable/versionedparcelable")
includeProject(":savedstate:savedstate", "savedstate/savedstate")
+includeProject(":savedstate:savedstate-ktx", "savedstate/savedstate-ktx")
includeProject(":security:security-biometric", "security/security-biometric")
includeProject(":security:security-crypto", "security/crypto")
includeProject(":security:security-identity-credential", "security/identity-credential")
diff --git a/sqlite/sqlite-inspection/src/androidTest/java/androidx/sqlite/inspection/test/ProtoExtensions.kt b/sqlite/sqlite-inspection/src/androidTest/java/androidx/sqlite/inspection/test/ProtoExtensions.kt
index 2057e3e..a6fb3a3 100644
--- a/sqlite/sqlite-inspection/src/androidTest/java/androidx/sqlite/inspection/test/ProtoExtensions.kt
+++ b/sqlite/sqlite-inspection/src/androidTest/java/androidx/sqlite/inspection/test/ProtoExtensions.kt
@@ -21,6 +21,8 @@
import androidx.sqlite.inspection.SqliteInspectorProtocol.Command
import androidx.sqlite.inspection.SqliteInspectorProtocol.GetSchemaCommand
import androidx.sqlite.inspection.SqliteInspectorProtocol.GetSchemaResponse
+import androidx.sqlite.inspection.SqliteInspectorProtocol.KeepDatabasesOpenCommand
+import androidx.sqlite.inspection.SqliteInspectorProtocol.KeepDatabasesOpenResponse
import androidx.sqlite.inspection.SqliteInspectorProtocol.QueryCommand
import androidx.sqlite.inspection.SqliteInspectorProtocol.QueryParameterValue
import androidx.sqlite.inspection.SqliteInspectorProtocol.Response
@@ -49,6 +51,16 @@
fun createTrackDatabasesResponse(): Response =
Response.newBuilder().setTrackDatabases(TrackDatabasesResponse.getDefaultInstance()).build()
+ fun createKeepDatabasesOpenCommand(setEnabled: Boolean): Command =
+ Command.newBuilder().setKeepDatabasesOpen(
+ KeepDatabasesOpenCommand.newBuilder().setSetEnabled(setEnabled)
+ ).build()
+
+ fun createKeepDatabasesOpenResponse(): Response =
+ Response.newBuilder().setKeepDatabasesOpen(
+ KeepDatabasesOpenResponse.getDefaultInstance()
+ ).build()
+
fun createGetSchemaCommand(databaseId: Int): Command =
Command.newBuilder().setGetSchema(
GetSchemaCommand.newBuilder().setDatabaseId(databaseId).build()
diff --git a/sqlite/sqlite-inspection/src/androidTest/java/androidx/sqlite/inspection/test/TrackDatabasesTest.kt b/sqlite/sqlite-inspection/src/androidTest/java/androidx/sqlite/inspection/test/TrackDatabasesTest.kt
index 218323a..953d47d 100644
--- a/sqlite/sqlite-inspection/src/androidTest/java/androidx/sqlite/inspection/test/TrackDatabasesTest.kt
+++ b/sqlite/sqlite-inspection/src/androidTest/java/androidx/sqlite/inspection/test/TrackDatabasesTest.kt
@@ -19,6 +19,9 @@
import android.database.sqlite.SQLiteDatabase
import androidx.inspection.InspectorEnvironment.ExitHook
import androidx.sqlite.inspection.SqliteInspectorProtocol.Event
+import androidx.sqlite.inspection.SqliteInspectorProtocol.Response
+import androidx.sqlite.inspection.test.MessageFactory.createKeepDatabasesOpenCommand
+import androidx.sqlite.inspection.test.MessageFactory.createKeepDatabasesOpenResponse
import androidx.sqlite.inspection.test.MessageFactory.createTrackDatabasesCommand
import androidx.sqlite.inspection.test.MessageFactory.createTrackDatabasesResponse
import androidx.test.ext.junit.runners.AndroidJUnit4
@@ -44,6 +47,8 @@
")" +
"Landroid/database/sqlite/SQLiteDatabase;"
+private const val ALL_REFERENCES_RELEASED_COMMAND_SIGNATURE = "onAllReferencesReleased()V"
+
@MediumTest
@RunWith(AndroidJUnit4::class)
class TrackDatabasesTest {
@@ -153,27 +158,134 @@
}
@Test
- fun test_track_databases_keeps_db_open() = runBlocking {
+ fun test_track_databases_keep_db_open_toggle() = runBlocking {
// given
- testEnvironment.sendCommand(createTrackDatabasesCommand())
- val onOpenHook = testEnvironment.consumeRegisteredHooks()
- .first { it.originMethod == OPEN_DATABASE_COMMAND_SIGNATURE }
-
- @Suppress("UNCHECKED_CAST")
- val onOpen = (onOpenHook.asExitHook as ExitHook<SQLiteDatabase>)::onExit
+ val hooks = startTracking()
// without inspecting
- val dbNoInspecting = Database("dbNoInspecting").createInstance(temporaryFolder)
- dbNoInspecting.close()
- assertThat(dbNoInspecting.isOpen).isFalse()
-
- // with inspecting
- listOf("db2", null).forEach { name ->
- val dbWithInspecting = Database(name).createInstance(temporaryFolder)
- onOpen(dbWithInspecting) // start inspecting
- dbWithInspecting.close()
- assertThat(dbWithInspecting.isOpen).isTrue()
+ Database("db1").createInstance(temporaryFolder).let { db ->
+ db.close()
+ assertClosed(db)
}
+
+ // with inspecting (initially keepOpen = false)
+ assertNoQueuedEvents()
+ listOf("db2", null).forEach { path ->
+ openDatabase(path, hooks).let { db ->
+ val id = receiveOpenedEventId(db)
+ closeDatabase(db, hooks)
+ receiveClosedEvent(id)
+ assertClosed(db)
+ }
+ }
+ assertNoQueuedEvents()
+
+ // toggle keepOpen = true
+ issueKeepDatabasesOpenCommand(true)
+ assertNoQueuedEvents()
+
+ // with inspecting (now keepOpen = true)
+ val dbs = listOf("db3", null).map { path ->
+ val db = openDatabase(path, hooks)
+ val id = receiveOpenedEventId(db)
+ id to db
+ }
+ dbs.forEach { (_, db) ->
+ closeDatabase(db, hooks)
+ assertOpen(db) // keep-open has worked
+ }
+ assertNoQueuedEvents()
+
+ // toggle keepOpen = false
+ issueKeepDatabasesOpenCommand(false)
+ assertNoQueuedEvents()
+ dbs.forEach { (id, db) ->
+ assertClosed(db)
+ hooks.triggerOnAllReferencesReleased(db)
+ receiveClosedEvent(id)
+ }
+ assertNoQueuedEvents()
+
+ // keepOpen = true with some of the same databases as before (they are not revived)
+ issueKeepDatabasesOpenCommand(true)
+ dbs.forEach { (_, db) ->
+ assertClosed(db)
+ }
+ assertNoQueuedEvents()
+
+ // keepOpen = false with a database with more than one reference
+ issueKeepDatabasesOpenCommand(false)
+ openDatabase("db4", hooks).let { db ->
+ db.acquireReference() // extra reference
+
+ closeDatabase(db, hooks)
+ assertOpen(db)
+
+ closeDatabase(db, hooks)
+ assertClosed(db)
+ }
+ }
+
+ @Test
+ fun test_on_closed_notification() = runBlocking {
+ // given
+ val hooks = startTracking()
+
+ // simple flow
+ assertNoQueuedEvents()
+ openDatabase("db1", hooks).let { db ->
+ val id = receiveOpenedEventId(db)
+ closeDatabase(db, hooks)
+ receiveClosedEvent(id)
+ assertClosed(db)
+ assertNoQueuedEvents()
+ }
+
+ // test that doesn't fire on each db.closed()
+ assertNoQueuedEvents()
+ openDatabase("db2", hooks).let { db ->
+ val id = receiveOpenedEventId(db)
+
+ db.acquireReference() // extra reference
+
+ // pass 1
+ closeDatabase(db, hooks)
+ assertOpen(db)
+ assertNoQueuedEvents()
+
+ // pass 2
+ closeDatabase(db, hooks)
+ assertClosed(db)
+ receiveClosedEvent(id)
+ assertNoQueuedEvents()
+ }
+ }
+
+ @Test
+ fun test_on_closed_and_reopened() = runBlocking {
+ // given
+ val hooks = startTracking()
+
+ // simple flow
+ val databaseName = "db1"
+
+ assertNoQueuedEvents()
+ var id: Int
+ openDatabase(databaseName, hooks).let { db ->
+ id = receiveOpenedEventId(db)
+ closeDatabase(db, hooks)
+ receiveClosedEvent(id)
+ assertClosed(db)
+ }
+ testEnvironment.assertNoQueuedEvents()
+
+ openDatabase(databaseName, hooks).let { db ->
+ assertThat(receiveOpenedEventId(db)).isEqualTo(id)
+ closeDatabase(db, hooks)
+ receiveClosedEvent(id)
+ assertClosed(db)
+ }
+ testEnvironment.assertNoQueuedEvents()
}
@Test
@@ -195,4 +307,91 @@
assertThat(queryTableCount(db1)).isEqualTo(2)
assertThat(queryTableCount(db2)).isEqualTo(1)
}
+
+ @Test
+ fun test_three_references_edge_ones_closed() = runBlocking {
+ val hooks = startTracking()
+
+ val db1a = openDatabase("path1", hooks)
+ val id1a = receiveOpenedEventId(db1a)
+
+ val db1b = openDatabase("path1", hooks)
+ assertNoQueuedEvents()
+
+ val db1c = openDatabase("path1", hooks)
+ assertNoQueuedEvents()
+
+ closeDatabase(db1a, hooks)
+ assertNoQueuedEvents()
+
+ closeDatabase(db1c, hooks)
+ assertNoQueuedEvents()
+
+ closeDatabase(db1b, hooks)
+ receiveClosedEvent(id1a)
+ }
+
+ private fun assertNoQueuedEvents() {
+ testEnvironment.assertNoQueuedEvents()
+ }
+
+ private suspend fun startTracking(): List<Hook> {
+ testEnvironment.sendCommand(createTrackDatabasesCommand())
+ return testEnvironment.consumeRegisteredHooks()
+ }
+
+ private fun openDatabase(path: String?, hooks: List<Hook>): SQLiteDatabase =
+ Database(path).createInstance(temporaryFolder).also { hooks.triggerOnOpened(it) }
+
+ private fun closeDatabase(database: SQLiteDatabase, hooks: List<Hook>) {
+ database.close()
+ if (!database.isOpen) {
+ hooks.triggerOnAllReferencesReleased(database)
+ }
+ }
+
+ private suspend fun issueKeepDatabasesOpenCommand(setEnabled: Boolean) {
+ testEnvironment.sendCommand(createKeepDatabasesOpenCommand(setEnabled)).let { response ->
+ assertThat(response.oneOfCase).isEqualTo(Response.OneOfCase.KEEP_DATABASES_OPEN)
+ assertThat(response).isEqualTo(createKeepDatabasesOpenResponse())
+ }
+ }
+
+ private suspend fun receiveOpenedEventId(database: SQLiteDatabase): Int =
+ testEnvironment.receiveEvent().let {
+ assertThat(it.oneOfCase).isEqualTo(Event.OneOfCase.DATABASE_OPENED)
+ assertThat(it.databaseOpened.path).isEqualTo(database.displayName)
+ it.databaseOpened.databaseId
+ }
+
+ private suspend fun receiveClosedEvent(id: Int) =
+ testEnvironment.receiveEvent().let {
+ assertThat(it.oneOfCase).isEqualTo(Event.OneOfCase.DATABASE_CLOSED)
+ assertThat(it.databaseClosed.databaseId).isEqualTo(id)
+ }
+
+ @Suppress("UNCHECKED_CAST")
+ private fun List<Hook>.triggerOnOpened(db: SQLiteDatabase) {
+ val onOpen = filter { it.originMethod == OPEN_DATABASE_COMMAND_SIGNATURE }
+ assertThat(onOpen).hasSize(1)
+ (onOpen.first().asExitHook as ExitHook<SQLiteDatabase>).onExit(db)
+ }
+
+ private fun List<Hook>.triggerOnAllReferencesReleased(db: SQLiteDatabase) {
+ val onReleasedHooks =
+ this.filter { it.originMethod == ALL_REFERENCES_RELEASED_COMMAND_SIGNATURE }
+ assertThat(onReleasedHooks).hasSize(2)
+ val onReleasedEntry = (onReleasedHooks.first { it is Hook.EntryHook }.asEntryHook)::onEntry
+ val onReleasedExit = (onReleasedHooks.first { it is Hook.ExitHook }.asExitHook)::onExit
+ onReleasedEntry(db, emptyList())
+ onReleasedExit(null)
+ }
+
+ private fun assertOpen(db: SQLiteDatabase) {
+ assertThat(db.isOpen).isTrue()
+ }
+
+ private fun assertClosed(db: SQLiteDatabase) {
+ assertThat(db.isOpen).isFalse()
+ }
}
diff --git a/sqlite/sqlite-inspection/src/main/java/androidx/sqlite/inspection/DatabaseExtensions.java b/sqlite/sqlite-inspection/src/main/java/androidx/sqlite/inspection/DatabaseExtensions.java
new file mode 100644
index 0000000..b9a8248
--- /dev/null
+++ b/sqlite/sqlite-inspection/src/main/java/androidx/sqlite/inspection/DatabaseExtensions.java
@@ -0,0 +1,67 @@
+/*
+ * 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.sqlite.inspection;
+
+import android.database.sqlite.SQLiteDatabase;
+
+import androidx.annotation.NonNull;
+
+import java.util.Objects;
+
+final class DatabaseExtensions {
+ private static final String sInMemoryDatabasePath = ":memory:";
+
+ /** Placeholder {@code %x} is for database's hashcode */
+ private static final String sInMemoryDatabaseNameFormat =
+ sInMemoryDatabasePath + " {hashcode=0x%x}";
+
+ private DatabaseExtensions() { }
+
+ /** Thread-safe as {@link SQLiteDatabase#getPath} and {@link Object#hashCode) are thread-safe.*/
+ static String pathForDatabase(@NonNull SQLiteDatabase database) {
+ return isInMemoryDatabase(database)
+ ? String.format(sInMemoryDatabaseNameFormat, database.hashCode())
+ : database.getPath();
+ }
+
+ /** Thread-safe as {@link SQLiteDatabase#getPath} is thread-safe. */
+ static boolean isInMemoryDatabase(@NonNull SQLiteDatabase database) {
+ return Objects.equals(sInMemoryDatabasePath, database.getPath());
+ }
+
+ /**
+ * Attempts to call {@link SQLiteDatabase#acquireReference} on the provided object.
+ *
+ * @return true if the operation was successful; false if unsuccessful because the database
+ * was already closed; otherwise re-throws the exception thrown by
+ * {@link SQLiteDatabase#acquireReference}.
+ */
+ // TODO: use in all places where a database operation is being performed (b/154908055)
+ static boolean tryAcquireReference(SQLiteDatabase database) {
+ try {
+ database.acquireReference();
+ return true; // success
+ } catch (IllegalStateException e) {
+ String message = e.getMessage();
+ if (message != null
+ && message.contains("attempt to re-open an already-closed object")) {
+ return false; // too late to secure a reference
+ }
+ throw e; // unexpected exception
+ }
+ }
+}
diff --git a/sqlite/sqlite-inspection/src/main/java/androidx/sqlite/inspection/DatabaseRegistry.java b/sqlite/sqlite-inspection/src/main/java/androidx/sqlite/inspection/DatabaseRegistry.java
new file mode 100644
index 0000000..9545fb7
--- /dev/null
+++ b/sqlite/sqlite-inspection/src/main/java/androidx/sqlite/inspection/DatabaseRegistry.java
@@ -0,0 +1,311 @@
+/*
+ * 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.sqlite.inspection;
+
+import static androidx.sqlite.inspection.DatabaseExtensions.isInMemoryDatabase;
+import static androidx.sqlite.inspection.DatabaseExtensions.pathForDatabase;
+import static androidx.sqlite.inspection.DatabaseExtensions.tryAcquireReference;
+
+import android.database.sqlite.SQLiteDatabase;
+import android.util.ArraySet;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * The class keeps track of databases under inspection, and can keep database connections open if
+ * such option is enabled.
+ * <p>Signals expected to be provided to the class:
+ * <ul>
+ * <li>{@link #notifyDatabaseOpened} - should be called when the inspection code detects a
+ * database open operation.
+ * <li>{@link #notifyAllDatabaseReferencesReleased} - should be called when the inspection code
+ * detects that the last database connection reference has been released (effectively a connection
+ * closed event).
+ * <li>{@link #notifyKeepOpenToggle} - should be called when the inspection code detects a
+ * request to change the keep-database-connection-open setting (enabled|disabled).
+ * </ul></p>
+ * <p>Callbacks exposed by the class:
+ * <ul>
+ * <li>Detected a database that is now open, and previously was either closed or not tracked.
+ * <li>Detected a database that is now closed, and previously was reported as open.
+ * </ul></p>
+ */
+class DatabaseRegistry {
+ private static final int NOT_TRACKED = -1;
+
+ // Called when tracking state changes (notTracked|closed)->open
+ private final Callback mOnOpenedCallback;
+ // Called when tracking state changes open->closed
+ private final Callback mOnClosedCallback;
+
+ // True if keep-database-connection-open functionality is enabled.
+ private boolean mKeepDatabasesOpen = false;
+
+ private final Object mLock = new Object();
+
+ // Starting from '1' to distinguish from '0' which could stand for an unset parameter.
+ @GuardedBy("mLock") private int mNextId = 1;
+
+ // TODO: decide if use weak-references to database objects
+
+ /**
+ * Database connection id -> a list of database references pointing to the same database. The
+ * collection is meant to only contain open connections (eventually consistent after all
+ * callbacks queued behind {@link #mLock} are processed).
+ */
+ @GuardedBy("mLock") private final Map<Integer, Set<SQLiteDatabase>> mDatabases =
+ new HashMap<>();
+
+ // Database connection id -> extra database reference used to facilitate the
+ // keep-database-connection-open functionality.
+ @GuardedBy("mLock") private final Map<Integer, SQLiteDatabase> mKeepOpenReferences =
+ new HashMap<>();
+
+ // Database path -> database connection id - allowing to report a consistent id for all
+ // references pointing to the same path.
+ @GuardedBy("mLock") private final Map<String, Integer> mPathToId = new HashMap<>();
+
+ /**
+ * @param onOpenedCallback called when tracking state changes (notTracked|closed)->open
+ * @param onClosedCallback called when tracking state changes open->closed
+ */
+ DatabaseRegistry(Callback onOpenedCallback, Callback onClosedCallback) {
+ mOnOpenedCallback = onOpenedCallback;
+ mOnClosedCallback = onClosedCallback;
+ }
+
+ /**
+ * Should be called when the inspection code detects a database being open operation.
+ * <p> Note that the method should be called before any code has a chance to close the
+ * database, so e.g. in an {@link androidx.inspection.InspectorEnvironment.ExitHook#onExit}
+ * before the return value is released.
+ * Thread-safe.
+ */
+ void notifyDatabaseOpened(@NonNull SQLiteDatabase database) {
+ handleDatabaseSignal(database);
+ }
+
+ /**
+ * Should be called when the inspection code detects that the last database connection
+ * reference has been released (effectively a connection closed event).
+ * Thread-safe.
+ */
+ void notifyAllDatabaseReferencesReleased(@NonNull SQLiteDatabase database) {
+ handleDatabaseSignal(database);
+ }
+
+ /**
+ * Should be called when the inspection code detects a request to change the
+ * keep-database-connection-open setting (enabled|disabled).
+ * Thread-safe.
+ */
+ void notifyKeepOpenToggle(boolean setEnabled) {
+ synchronized (mLock) {
+ if (mKeepDatabasesOpen == setEnabled) {
+ return; // no change
+ }
+
+ if (setEnabled) { // allowClose -> keepOpen
+ mKeepDatabasesOpen = true;
+
+ for (int id : mDatabases.keySet()) {
+ acquireKeepOpenReference(id);
+ }
+ } else { // keepOpen -> allowClose
+ mKeepDatabasesOpen = false;
+ for (SQLiteDatabase database : mKeepOpenReferences.values()) {
+ database.releaseReference();
+ }
+ mKeepOpenReferences.clear();
+ }
+ }
+ }
+
+ /** Thread-safe */
+ private void handleDatabaseSignal(@NonNull SQLiteDatabase database) {
+ Integer notifyOpenedId = null;
+ Integer notifyClosedId = null;
+
+ synchronized (mLock) {
+ int id = getIdForDatabase(database);
+
+ // Guaranteed up to date:
+ // - either called before the newly created connection is returned from the creation
+ // method,
+ // - or called after the last reference was released which cannot be undone.
+ final boolean isOpen = database.isOpen();
+
+ if (id == NOT_TRACKED) { // handling a transition: not tracked -> tracked
+ id = mNextId++;
+ registerReference(id, database);
+ if (isOpen) {
+ // isOpen should be true here, but in case we missed a connection creation
+ // method, we shouldn't report the database as open.
+ notifyOpenedId = id;
+ }
+ } else if (isOpen) { // handling a transition: tracked(closed) -> tracked(open)
+ // There are two scenarios here:
+ // - hasReferences is up to date and there is an open reference already, so we
+ // don't need to announce a new one
+ // - hasReferences is stale, and references in it are queued up to be
+ // announced as closing, in this case the outside world thinks that the
+ // connection is open (close ones not processed yet), so we don't need to
+ // announce anything; later, when processing the queued up closed events nothing
+ // will be announced as the currently processed database will keep at least one open
+ // connection.
+ if (!hasReferences(id)) {
+ notifyOpenedId = id;
+ }
+ registerReference(id, database);
+ } else { // handling a transition: tracked(open) -> tracked(closed)
+ // There are two scenarios here:
+ // - hasReferences is up to date and we can use it
+ // - hasReferences is stale, and references in it are queued up to be
+ // announced as closed; in this case there is no harm not announcing a closed
+ // event now as the subsequent calls will do it if appropriate
+ final boolean hasReferencesPre = hasReferences(id);
+ unregisterReference(id, database);
+ final boolean hasReferencesPost = hasReferences(id);
+ if (hasReferencesPre && !hasReferencesPost) {
+ notifyClosedId = id;
+ }
+ }
+
+ acquireKeepOpenReference(id);
+
+ // notify of changes if any
+ if (notifyOpenedId != null) {
+ mOnOpenedCallback.onPostEvent(notifyOpenedId, pathForDatabase(database));
+ } else if (notifyClosedId != null) {
+ mOnClosedCallback.onPostEvent(notifyClosedId, pathForDatabase(database));
+ }
+ }
+ }
+
+ /**
+ * Returns a currently active database reference if one is available. Null otherwise.
+ * Thread-safe
+ */
+ @Nullable
+ SQLiteDatabase getDatabase(int databaseId) {
+ synchronized (mLock) {
+ return getActiveReference(databaseId);
+ }
+ }
+
+ @GuardedBy("mLock")
+ private void registerReference(int id, @NonNull SQLiteDatabase database) {
+ Set<SQLiteDatabase> references = mDatabases.get(id);
+ if (references == null) {
+ references = new ArraySet<>(1);
+ mDatabases.put(id, references);
+ if (!isInMemoryDatabase(database)) {
+ mPathToId.put(pathForDatabase(database), id);
+ }
+ }
+ references.add(database);
+ }
+
+ @GuardedBy("mLock")
+ private void unregisterReference(int id, @NonNull SQLiteDatabase database) {
+ Set<SQLiteDatabase> references = mDatabases.get(id);
+ if (references == null) {
+ return;
+ }
+ references.remove(database);
+ }
+
+ @Nullable
+ @GuardedBy("mLock")
+ private SQLiteDatabase getActiveReference(int databaseId) {
+ final Set<SQLiteDatabase> references = mDatabases.get(databaseId);
+ if (references != null) {
+ for (SQLiteDatabase reference : references) {
+ if (reference.isOpen()) {
+ return reference;
+ }
+ }
+ }
+ return null;
+ }
+
+ @SuppressWarnings("StatementWithEmptyBody")
+ @GuardedBy("mLock")
+ private void acquireKeepOpenReference(int id) {
+ if (!mKeepDatabasesOpen || mKeepOpenReferences.containsKey(id)) {
+ // Keep-open is disabled or we already have a keep-open-reference for that id.
+ return;
+ }
+
+ // Try secure a keep-open reference
+ Set<SQLiteDatabase> databases = mDatabases.get(id);
+ if (databases == null) {
+ return; // no databases with that id
+ }
+
+ for (SQLiteDatabase database : databases) {
+ if (!database.isOpen()) {
+ continue;
+ }
+
+ if (tryAcquireReference(database)) {
+ mKeepOpenReferences.put(id, database);
+ return; // secured a reference, so done
+ } else {
+ // The connection is already closed. Continuing the search.
+ }
+ }
+ }
+
+ @GuardedBy("mLock")
+ private int getIdForDatabase(SQLiteDatabase database) {
+ String databasePath = pathForDatabase(database);
+
+ Integer previousId = mPathToId.get(databasePath);
+ if (previousId != null) {
+ return previousId;
+ }
+
+ if (isInMemoryDatabase(database)) {
+ for (Map.Entry<Integer, Set<SQLiteDatabase>> entry : mDatabases.entrySet()) {
+ for (SQLiteDatabase entryDb : entry.getValue()) {
+ if (entryDb == database) {
+ return entry.getKey();
+ }
+ }
+ }
+ }
+
+ return NOT_TRACKED;
+ }
+
+ @GuardedBy("mLock")
+ private boolean hasReferences(int databaseId) {
+ final Set<SQLiteDatabase> references = mDatabases.get(databaseId);
+ return references != null && !references.isEmpty();
+ }
+
+ interface Callback {
+ void onPostEvent(int databaseId, String path);
+ }
+}
diff --git a/sqlite/sqlite-inspection/src/main/java/androidx/sqlite/inspection/SqliteInspector.java b/sqlite/sqlite-inspection/src/main/java/androidx/sqlite/inspection/SqliteInspector.java
index 89b10c1..f9ef5a4 100644
--- a/sqlite/sqlite-inspection/src/main/java/androidx/sqlite/inspection/SqliteInspector.java
+++ b/sqlite/sqlite-inspection/src/main/java/androidx/sqlite/inspection/SqliteInspector.java
@@ -31,7 +31,6 @@
import android.database.sqlite.SQLiteStatement;
import android.os.CancellationSignal;
-import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.inspection.Connection;
@@ -40,6 +39,7 @@
import androidx.sqlite.inspection.SqliteInspectorProtocol.CellValue;
import androidx.sqlite.inspection.SqliteInspectorProtocol.Column;
import androidx.sqlite.inspection.SqliteInspectorProtocol.Command;
+import androidx.sqlite.inspection.SqliteInspectorProtocol.DatabaseClosedEvent;
import androidx.sqlite.inspection.SqliteInspectorProtocol.DatabaseOpenedEvent;
import androidx.sqlite.inspection.SqliteInspectorProtocol.DatabasePossiblyChangedEvent;
import androidx.sqlite.inspection.SqliteInspectorProtocol.ErrorContent;
@@ -49,6 +49,8 @@
import androidx.sqlite.inspection.SqliteInspectorProtocol.Event;
import androidx.sqlite.inspection.SqliteInspectorProtocol.GetSchemaCommand;
import androidx.sqlite.inspection.SqliteInspectorProtocol.GetSchemaResponse;
+import androidx.sqlite.inspection.SqliteInspectorProtocol.KeepDatabasesOpenCommand;
+import androidx.sqlite.inspection.SqliteInspectorProtocol.KeepDatabasesOpenResponse;
import androidx.sqlite.inspection.SqliteInspectorProtocol.QueryCommand;
import androidx.sqlite.inspection.SqliteInspectorProtocol.QueryParameterValue;
import androidx.sqlite.inspection.SqliteInspectorProtocol.QueryResponse;
@@ -64,11 +66,9 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
-import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Set;
import java.util.WeakHashMap;
import java.util.concurrent.Executor;
@@ -96,18 +96,15 @@
+ ")"
+ "Landroid/database/sqlite/SQLiteDatabase;";
+ private static final String sAllReferencesReleaseCommandSignature =
+ "onAllReferencesReleased()V";
+
// SQLiteStatement methods
private static final List<String> sSqliteStatementExecuteMethodsSignatures = Arrays.asList(
"execute()V",
"executeInsert()J",
"executeUpdateDelete()I");
- private static final String sInMemoryDatabasePath = ":memory:";
-
- /** Placeholder {@code %x} is for database's hashcode */
- private static final String sInMemoryDatabaseNameFormat =
- sInMemoryDatabasePath + " {hashcode=0x%x}";
-
private static final int INVALIDATION_MIN_INTERVAL_MS = 1000;
// Note: this only works on API26+ because of pragma_* functions
@@ -148,7 +145,7 @@
private static final Set<String> sHiddenTables = new HashSet<>(Arrays.asList(
"android_metadata", "sqlite_sequence"));
- private final DatabaseRegistry mDatabaseRegistry = new DatabaseRegistry();
+ private final DatabaseRegistry mDatabaseRegistry;
private final InspectorEnvironment mEnvironment;
private final Executor mIOExecutor;
private final ScheduledExecutorService mScheduledExecutor;
@@ -168,20 +165,41 @@
mScheduledExecutor = scheduledExecutor;
mRoomInvalidationRegistry = new RoomInvalidationRegistry(mEnvironment);
mSqlDelightInvalidation = SqlDelightInvalidation.create(mEnvironment);
+
+ mDatabaseRegistry = new DatabaseRegistry(
+ new DatabaseRegistry.Callback() {
+ @Override
+ public void onPostEvent(int databaseId, String path) {
+ dispatchDatabaseOpenedEvent(databaseId, path);
+ }
+ },
+ new DatabaseRegistry.Callback() {
+ @Override
+ public void onPostEvent(int databaseId, String path) {
+ dispatchDatabaseClosedEvent(databaseId);
+ }
+ });
}
@Override
public void onReceiveCommand(@NonNull byte[] data, @NonNull CommandCallback callback) {
try {
Command command = Command.parseFrom(data);
- if (command.hasTrackDatabases()) {
+ switch (command.getOneOfCase()) {
+ case TRACK_DATABASES:
handleTrackDatabases(callback);
- } else if (command.hasGetSchema()) {
+ break;
+ case GET_SCHEMA:
handleGetSchema(command.getGetSchema(), callback);
- } else if (command.hasQuery()) {
+ break;
+ case QUERY:
handleQuery(command.getQuery(), callback);
- } else {
- callback.reply(
+ break;
+ case KEEP_DATABASES_OPEN:
+ handleKeepDatabasesOpen(command.getKeepDatabasesOpen(), callback);
+ break;
+ default:
+ callback.reply(
createErrorOccurredResponse(
"Unrecognised command type: " + command.getOneOfCase().name(),
null,
@@ -216,7 +234,7 @@
@Override
public SQLiteDatabase onExit(SQLiteDatabase database) {
try {
- onDatabaseAdded(database);
+ onDatabaseOpened(database);
} catch (Exception exception) {
getConnection().sendEvent(createErrorOccurredEvent(
"Unhandled Exception while processing an onDatabaseAdded "
@@ -230,15 +248,36 @@
});
}
- registerInvalidationHooks();
+ EntryExitMatchingHookRegistry hookRegistry = new EntryExitMatchingHookRegistry(
+ mEnvironment);
+
+ registerInvalidationHooks(hookRegistry);
+ registerDatabaseClosedHooks(hookRegistry);
List<SQLiteDatabase> instances = mEnvironment.findInstances(SQLiteDatabase.class);
for (SQLiteDatabase instance : instances) {
- onDatabaseAdded(instance);
+ onDatabaseOpened(instance);
}
}
- private void registerInvalidationHooks() {
+ /**
+ * Tracking potential database closed events via {@link #sAllReferencesReleaseCommandSignature}
+ */
+ private void registerDatabaseClosedHooks(EntryExitMatchingHookRegistry hookRegistry) {
+ hookRegistry.registerHook(SQLiteDatabase.class, sAllReferencesReleaseCommandSignature,
+ new EntryExitMatchingHookRegistry.OnExitCallback() {
+ @Override
+ public void onExit(EntryExitMatchingHookRegistry.Frame exitFrame) {
+ final Object thisObject = exitFrame.mThisObject;
+ if (thisObject instanceof SQLiteDatabase) {
+ mDatabaseRegistry.notifyAllDatabaseReferencesReleased(
+ (SQLiteDatabase) thisObject);
+ }
+ }
+ });
+ }
+
+ private void registerInvalidationHooks(EntryExitMatchingHookRegistry hookRegistry) {
/**
* Schedules a task using {@link mScheduledExecutor} and executes it on {@link mIOExecutor}.
**/
@@ -260,13 +299,12 @@
new Runnable() {
@Override
public void run() {
- // TODO: wrap in a try/catch block
- sendDatabasePossiblyChangedEvent();
+ dispatchDatabasePossiblyChangedEvent();
}
}, deferredExecutor);
registerInvalidationHooksSqliteStatement(throttler);
- registerInvalidationHooksSQLiteCursor(throttler);
+ registerInvalidationHooksSQLiteCursor(throttler, hookRegistry);
}
/**
@@ -298,9 +336,8 @@
* In order to access cursor's query, we also use {@link SQLiteDatabase#rawQueryWithFactory}
* which takes a query String and constructs a cursor based on it.
*/
- private void registerInvalidationHooksSQLiteCursor(final RequestCollapsingThrottler throttler) {
- EntryExitMatchingHookRegistry hookRegistry = new EntryExitMatchingHookRegistry(
- mEnvironment);
+ private void registerInvalidationHooksSQLiteCursor(final RequestCollapsingThrottler throttler,
+ EntryExitMatchingHookRegistry hookRegistry) {
// TODO: add active pruning via Cursor#close listener
final Map<SQLiteCursor, Void> trackedCursors = Collections.synchronizedMap(
@@ -343,9 +380,26 @@
}
}
- private void sendDatabasePossiblyChangedEvent() {
+ private void dispatchDatabaseOpenedEvent(int databaseId, String path) {
+ getConnection().sendEvent(Event.newBuilder().setDatabaseOpened(
+ DatabaseOpenedEvent
+ .newBuilder()
+ .setDatabaseId(databaseId)
+ .setName(path)
+ .setPath(path)
+ ).build().toByteArray());
+ }
+
+ private void dispatchDatabaseClosedEvent(int databaseId) {
+ getConnection().sendEvent(Event.newBuilder().setDatabaseClosed(
+ DatabaseClosedEvent.newBuilder().setDatabaseId(databaseId)
+ ).build().toByteArray());
+ }
+
+ private void dispatchDatabasePossiblyChangedEvent() {
getConnection().sendEvent(Event.newBuilder().setDatabasePossiblyChanged(
- DatabasePossiblyChangedEvent.getDefaultInstance()).build().toByteArray());
+ DatabasePossiblyChangedEvent.getDefaultInstance()
+ ).build().toByteArray());
}
private void handleGetSchema(GetSchemaCommand command, CommandCallback callback) {
@@ -403,6 +457,16 @@
}
}
+ private void handleKeepDatabasesOpen(KeepDatabasesOpenCommand keepDatabasesOpen,
+ CommandCallback callback) {
+ // Acknowledge the command
+ callback.reply(Response.newBuilder().setKeepDatabasesOpen(
+ KeepDatabasesOpenResponse.getDefaultInstance()
+ ).build().toByteArray());
+
+ mDatabaseRegistry.notifyKeepOpenToggle(keepDatabasesOpen.getSetEnabled());
+ }
+
@SuppressLint("Recycle") // For: "The cursor should be freed up after use with #close"
private static Cursor rawQuery(@NonNull SQLiteDatabase database, @NonNull String queryText,
@NonNull final String[] params, @Nullable CancellationSignal cancellationSignal) {
@@ -561,39 +625,10 @@
}
}
- @SuppressWarnings("WeakerAccess")
- // avoiding a synthetic accessor
- void onDatabaseAdded(SQLiteDatabase database) {
- Event response;
- int id = mDatabaseRegistry.addDatabase(database);
- if (id == DatabaseRegistry.ALREADY_TRACKED) return; // Nothing to do
-
- // TODO: replace with db open/closed tracking as this will keep the database open
- database.acquireReference();
-
- response = createDatabaseOpenedEvent(id, generateDatabaseName(database));
+ @SuppressWarnings("WeakerAccess") // avoiding a synthetic accessor
+ void onDatabaseOpened(SQLiteDatabase database) {
mRoomInvalidationRegistry.invalidateCache();
- getConnection().sendEvent(response.toByteArray());
- }
-
- private static String generateDatabaseName(@NonNull SQLiteDatabase database) {
- return isInMemoryDatabase(database)
- ? String.format(sInMemoryDatabaseNameFormat, database.hashCode())
- : database.getPath();
- }
-
- private static boolean isInMemoryDatabase(@NonNull SQLiteDatabase database) {
- return Objects.equals(sInMemoryDatabasePath, database.getPath());
- }
-
- private Event createDatabaseOpenedEvent(int id, String path) {
- return Event.newBuilder().setDatabaseOpened(
- DatabaseOpenedEvent.newBuilder()
- .setDatabaseId(id)
- .setName(path)
- .setPath(path)
- .build())
- .build();
+ mDatabaseRegistry.notifyDatabaseOpened(database);
}
private Event createErrorOccurredEvent(@Nullable String message, @Nullable String stackTrace,
@@ -647,52 +682,4 @@
exception.printStackTrace(new PrintWriter(writer));
return writer.toString();
}
-
- static class DatabaseRegistry {
- static final int ALREADY_TRACKED = -1;
-
- private final Object mLock = new Object();
-
- // starting from '1' to distinguish from '0' which could stand for an unset parameter
- @GuardedBy("mLock") private int mNextId = 1;
-
- @GuardedBy("mLock") private final Map<Integer, SQLiteDatabase> mDatabases = new HashMap<>();
-
- /**
- * Thread safe
- *
- * @return id used to track the database
- */
- int addDatabase(@NonNull SQLiteDatabase database) {
- synchronized (mLock) {
- // TODO: decide if to track database close events and update here
- // TODO: decide if use weak-references to database objects
- // TODO: consider database.acquireReference() approach
-
- // check if already tracked
- for (Map.Entry<Integer, SQLiteDatabase> entry : mDatabases.entrySet()) {
- // Instance already tracked
- if (entry.getValue() == database) {
- return ALREADY_TRACKED;
- }
- // Path already tracked (and not an in-memory database)
- if (!isInMemoryDatabase(database)
- && Objects.equals(database.getPath(), entry.getValue().getPath())) {
- return ALREADY_TRACKED;
- }
- }
-
- // make a new entry
- int id = mNextId++;
- mDatabases.put(id, database);
- return id;
- }
- }
-
- @Nullable SQLiteDatabase getDatabase(int databaseId) {
- synchronized (mLock) {
- return mDatabases.get(databaseId);
- }
- }
- }
}
diff --git a/sqlite/sqlite-inspection/src/main/proto/live_sql_protocol.proto b/sqlite/sqlite-inspection/src/main/proto/live_sql_protocol.proto
index fed6e16..171e075 100644
--- a/sqlite/sqlite-inspection/src/main/proto/live_sql_protocol.proto
+++ b/sqlite/sqlite-inspection/src/main/proto/live_sql_protocol.proto
@@ -31,6 +31,7 @@
TrackDatabasesCommand track_databases = 1;
GetSchemaCommand get_schema = 2;
QueryCommand query = 3;
+ KeepDatabasesOpenCommand keep_databases_open = 4;
}
}
@@ -65,6 +66,13 @@
}
}
+// Request to prevent databases from being closed by the app
+// (allowing for a larger time-window for inspection)
+message KeepDatabasesOpenCommand {
+ // True to enable the functionality; false to disable
+ bool set_enabled = 1;
+}
+
// --- Responses ---
// Generic Response object grouping all Inspector Response types to Command
@@ -75,6 +83,7 @@
TrackDatabasesResponse track_databases = 1;
GetSchemaResponse get_schema = 2;
QueryResponse query = 3;
+ KeepDatabasesOpenResponse keep_databases_open = 4;
ErrorOccurredResponse error_occurred = 400;
}
}
@@ -134,6 +143,8 @@
}
}
+message KeepDatabasesOpenResponse {}
+
// General Error message.
// TODO: decide on a more fine-grained approach
message ErrorOccurredResponse {
@@ -168,7 +179,8 @@
// Wrapped specialised Event.
oneof OneOf {
DatabaseOpenedEvent database_opened = 1;
- DatabasePossiblyChangedEvent database_possibly_changed = 2;
+ DatabaseClosedEvent database_closed = 2;
+ DatabasePossiblyChangedEvent database_possibly_changed = 3;
ErrorOccurredEvent error_occurred = 400;
}
}
@@ -189,6 +201,12 @@
string path = 3;
}
+// Notification of a database connection closed (database no longer query-able)
+message DatabaseClosedEvent {
+ // Id uniquely identifying a connection to a database.
+ int32 database_id = 1;
+}
+
// An event sent when an operation that could potentially change the contents of a database has
// been detected. The event might be used in triggering a refresh of currently displayed query
// results to keep the results current.
diff --git a/transition/transition-ktx/api/2.0.0-alpha01.txt b/transition/transition-ktx/api/2.0.0-alpha01.txt
deleted file mode 100644
index b01e160..0000000
--- a/transition/transition-ktx/api/2.0.0-alpha01.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Signature format: 3.0
-package androidx.transition {
-
- public final class TransitionKt {
- method public static inline androidx.transition.Transition.TransitionListener addListener(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onPause = {});
- method public static inline androidx.transition.Transition.TransitionListener doOnCancel(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnEnd(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnPause(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnResume(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnStart(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- }
-
-}
-
diff --git a/transition/transition-ktx/api/public_plus_experimental_2.0.0-alpha01.txt b/transition/transition-ktx/api/public_plus_experimental_2.0.0-alpha01.txt
deleted file mode 100644
index b01e160..0000000
--- a/transition/transition-ktx/api/public_plus_experimental_2.0.0-alpha01.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Signature format: 3.0
-package androidx.transition {
-
- public final class TransitionKt {
- method public static inline androidx.transition.Transition.TransitionListener addListener(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onPause = {});
- method public static inline androidx.transition.Transition.TransitionListener doOnCancel(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnEnd(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnPause(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnResume(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnStart(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- }
-
-}
-
diff --git a/transition/transition-ktx/api/restricted_2.0.0-alpha01.txt b/transition/transition-ktx/api/restricted_2.0.0-alpha01.txt
deleted file mode 100644
index b01e160..0000000
--- a/transition/transition-ktx/api/restricted_2.0.0-alpha01.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-// Signature format: 3.0
-package androidx.transition {
-
- public final class TransitionKt {
- method public static inline androidx.transition.Transition.TransitionListener addListener(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onEnd = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onStart = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onCancel = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onResume = {}, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> onPause = {});
- method public static inline androidx.transition.Transition.TransitionListener doOnCancel(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnEnd(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnPause(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnResume(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- method public static inline androidx.transition.Transition.TransitionListener doOnStart(androidx.transition.Transition, kotlin.jvm.functions.Function1<? super androidx.transition.Transition,kotlin.Unit> action);
- }
-
-}
-
diff --git a/transition/transition/api/2.0.0-alpha01.txt b/transition/transition/api/2.0.0-alpha01.txt
deleted file mode 100644
index d5d8dbf..0000000
--- a/transition/transition/api/2.0.0-alpha01.txt
+++ /dev/null
@@ -1,283 +0,0 @@
-// Signature format: 3.0
-package androidx.transition {
-
- public class ArcMotion extends androidx.transition.PathMotion {
- ctor public ArcMotion();
- ctor public ArcMotion(android.content.Context, android.util.AttributeSet);
- method public float getMaximumAngle();
- method public float getMinimumHorizontalAngle();
- method public float getMinimumVerticalAngle();
- method public android.graphics.Path getPath(float, float, float, float);
- method public void setMaximumAngle(float);
- method public void setMinimumHorizontalAngle(float);
- method public void setMinimumVerticalAngle(float);
- }
-
- public class AutoTransition extends androidx.transition.TransitionSet {
- ctor public AutoTransition();
- ctor public AutoTransition(android.content.Context, android.util.AttributeSet);
- }
-
- public class ChangeBounds extends androidx.transition.Transition {
- ctor public ChangeBounds();
- ctor public ChangeBounds(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public boolean getResizeClip();
- method public void setResizeClip(boolean);
- }
-
- public class ChangeClipBounds extends androidx.transition.Transition {
- ctor public ChangeClipBounds();
- ctor public ChangeClipBounds(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- }
-
- public class ChangeImageTransform extends androidx.transition.Transition {
- ctor public ChangeImageTransform();
- ctor public ChangeImageTransform(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- }
-
- public class ChangeScroll extends androidx.transition.Transition {
- ctor public ChangeScroll();
- ctor public ChangeScroll(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- }
-
- public class ChangeTransform extends androidx.transition.Transition {
- ctor public ChangeTransform();
- ctor public ChangeTransform(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public boolean getReparent();
- method public boolean getReparentWithOverlay();
- method public void setReparent(boolean);
- method public void setReparentWithOverlay(boolean);
- }
-
- public class CircularPropagation extends androidx.transition.VisibilityPropagation {
- ctor public CircularPropagation();
- method public long getStartDelay(android.view.ViewGroup!, androidx.transition.Transition!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public void setPropagationSpeed(float);
- }
-
- public class Explode extends androidx.transition.Visibility {
- ctor public Explode();
- ctor public Explode(android.content.Context, android.util.AttributeSet);
- }
-
- public class Fade extends androidx.transition.Visibility {
- ctor public Fade(int);
- ctor public Fade();
- ctor public Fade(android.content.Context, android.util.AttributeSet);
- field public static final int IN = 1; // 0x1
- field public static final int OUT = 2; // 0x2
- }
-
- public abstract class PathMotion {
- ctor public PathMotion();
- ctor public PathMotion(android.content.Context, android.util.AttributeSet);
- method public abstract android.graphics.Path getPath(float, float, float, float);
- }
-
- public class PatternPathMotion extends androidx.transition.PathMotion {
- ctor public PatternPathMotion();
- ctor public PatternPathMotion(android.content.Context, android.util.AttributeSet);
- ctor public PatternPathMotion(android.graphics.Path!);
- method public android.graphics.Path getPath(float, float, float, float);
- method public android.graphics.Path! getPatternPath();
- method public void setPatternPath(android.graphics.Path!);
- }
-
- public class Scene {
- ctor public Scene(android.view.ViewGroup);
- ctor public Scene(android.view.ViewGroup, android.view.View);
- method public void enter();
- method public void exit();
- method public static androidx.transition.Scene? getCurrentScene(android.view.ViewGroup);
- method public static androidx.transition.Scene getSceneForLayout(android.view.ViewGroup, @LayoutRes int, android.content.Context);
- method public android.view.ViewGroup getSceneRoot();
- method public void setEnterAction(Runnable?);
- method public void setExitAction(Runnable?);
- }
-
- public class SidePropagation extends androidx.transition.VisibilityPropagation {
- ctor public SidePropagation();
- method public long getStartDelay(android.view.ViewGroup!, androidx.transition.Transition!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public void setPropagationSpeed(float);
- method public void setSide(int);
- }
-
- public class Slide extends androidx.transition.Visibility {
- ctor public Slide();
- ctor public Slide(int);
- ctor public Slide(android.content.Context, android.util.AttributeSet);
- method public int getSlideEdge();
- method public void setSlideEdge(int);
- }
-
- public abstract class Transition implements java.lang.Cloneable {
- ctor public Transition();
- ctor public Transition(android.content.Context, android.util.AttributeSet);
- method public androidx.transition.Transition addListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.Transition addTarget(android.view.View);
- method public androidx.transition.Transition addTarget(@IdRes int);
- method public androidx.transition.Transition addTarget(String);
- method public androidx.transition.Transition addTarget(Class<?>);
- method public abstract void captureEndValues(androidx.transition.TransitionValues);
- method public abstract void captureStartValues(androidx.transition.TransitionValues);
- method public androidx.transition.Transition clone();
- method public androidx.core.animation.Animator? createAnimator(android.view.ViewGroup, androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
- method public androidx.transition.Transition excludeChildren(android.view.View, boolean);
- method public androidx.transition.Transition excludeChildren(@IdRes int, boolean);
- method public androidx.transition.Transition excludeChildren(Class<?>, boolean);
- method public androidx.transition.Transition excludeTarget(android.view.View, boolean);
- method public androidx.transition.Transition excludeTarget(@IdRes int, boolean);
- method public androidx.transition.Transition excludeTarget(String, boolean);
- method public androidx.transition.Transition excludeTarget(Class<?>, boolean);
- method public long getDuration();
- method public android.graphics.Rect? getEpicenter();
- method public androidx.transition.Transition.EpicenterCallback? getEpicenterCallback();
- method public androidx.core.animation.Interpolator? getInterpolator();
- method public String getName();
- method public androidx.transition.PathMotion getPathMotion();
- method public androidx.transition.TransitionPropagation? getPropagation();
- method public long getStartDelay();
- method public java.util.List<java.lang.Integer!> getTargetIds();
- method public java.util.List<java.lang.String!>? getTargetNames();
- method public java.util.List<java.lang.Class<?>!>? getTargetTypes();
- method public java.util.List<android.view.View!> getTargets();
- method public String![]? getTransitionProperties();
- method public androidx.transition.TransitionValues? getTransitionValues(android.view.View, boolean);
- method public boolean isTransitionRequired(androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
- method public androidx.transition.Transition removeListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.Transition removeTarget(android.view.View);
- method public androidx.transition.Transition removeTarget(@IdRes int);
- method public androidx.transition.Transition removeTarget(String);
- method public androidx.transition.Transition removeTarget(Class<?>);
- method public androidx.transition.Transition setDuration(long);
- method public void setEpicenterCallback(androidx.transition.Transition.EpicenterCallback?);
- method public androidx.transition.Transition setInterpolator(androidx.core.animation.Interpolator?);
- method public void setMatchOrder(int...);
- method public void setPathMotion(androidx.transition.PathMotion?);
- method public void setPropagation(androidx.transition.TransitionPropagation?);
- method public androidx.transition.Transition setStartDelay(long);
- field public static final int MATCH_ID = 3; // 0x3
- field public static final int MATCH_INSTANCE = 1; // 0x1
- field public static final int MATCH_ITEM_ID = 4; // 0x4
- field public static final int MATCH_NAME = 2; // 0x2
- }
-
- public abstract static class Transition.EpicenterCallback {
- ctor public Transition.EpicenterCallback();
- method public abstract android.graphics.Rect! onGetEpicenter(androidx.transition.Transition);
- }
-
- public static interface Transition.TransitionListener {
- method public void onTransitionCancel(androidx.transition.Transition);
- method public void onTransitionEnd(androidx.transition.Transition);
- method public void onTransitionPause(androidx.transition.Transition);
- method public void onTransitionResume(androidx.transition.Transition);
- method public void onTransitionStart(androidx.transition.Transition);
- }
-
- public class TransitionInflater {
- method public static androidx.transition.TransitionInflater from(android.content.Context);
- method public androidx.transition.Transition! inflateTransition(int);
- method public androidx.transition.TransitionManager! inflateTransitionManager(int, android.view.ViewGroup!);
- }
-
- public class TransitionListenerAdapter implements androidx.transition.Transition.TransitionListener {
- ctor public TransitionListenerAdapter();
- method public void onTransitionCancel(androidx.transition.Transition);
- method public void onTransitionEnd(androidx.transition.Transition);
- method public void onTransitionPause(androidx.transition.Transition);
- method public void onTransitionResume(androidx.transition.Transition);
- method public void onTransitionStart(androidx.transition.Transition);
- }
-
- public class TransitionManager {
- ctor public TransitionManager();
- method public static void beginDelayedTransition(android.view.ViewGroup);
- method public static void beginDelayedTransition(android.view.ViewGroup, androidx.transition.Transition?);
- method public static void endTransitions(android.view.ViewGroup!);
- method public static void go(androidx.transition.Scene);
- method public static void go(androidx.transition.Scene, androidx.transition.Transition?);
- method public void setTransition(androidx.transition.Scene, androidx.transition.Transition?);
- method public void setTransition(androidx.transition.Scene, androidx.transition.Scene, androidx.transition.Transition?);
- method public void transitionTo(androidx.transition.Scene);
- }
-
- public abstract class TransitionPropagation {
- ctor public TransitionPropagation();
- method public abstract void captureValues(androidx.transition.TransitionValues!);
- method public abstract String![]! getPropagationProperties();
- method public abstract long getStartDelay(android.view.ViewGroup!, androidx.transition.Transition!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- }
-
- public class TransitionSet extends androidx.transition.Transition {
- ctor public TransitionSet();
- ctor public TransitionSet(android.content.Context, android.util.AttributeSet);
- method public androidx.transition.TransitionSet addListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.TransitionSet addTarget(android.view.View);
- method public androidx.transition.TransitionSet addTarget(@IdRes int);
- method public androidx.transition.TransitionSet addTarget(String);
- method public androidx.transition.TransitionSet addTarget(Class<?>);
- method public androidx.transition.TransitionSet addTransition(androidx.transition.Transition);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public int getOrdering();
- method public androidx.transition.Transition? getTransitionAt(int);
- method public int getTransitionCount();
- method public androidx.transition.TransitionSet removeListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.TransitionSet removeTarget(@IdRes int);
- method public androidx.transition.TransitionSet removeTarget(android.view.View);
- method public androidx.transition.TransitionSet removeTarget(Class<?>);
- method public androidx.transition.TransitionSet removeTarget(String);
- method public androidx.transition.TransitionSet removeTransition(androidx.transition.Transition);
- method public androidx.transition.TransitionSet setDuration(long);
- method public androidx.transition.TransitionSet setInterpolator(androidx.core.animation.Interpolator?);
- method public androidx.transition.TransitionSet setOrdering(int);
- method public androidx.transition.TransitionSet setStartDelay(long);
- field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
- field public static final int ORDERING_TOGETHER = 0; // 0x0
- }
-
- public class TransitionValues {
- ctor @Deprecated public TransitionValues();
- ctor public TransitionValues(android.view.View);
- field public final java.util.Map<java.lang.String!,java.lang.Object!>! values;
- field public android.view.View! view;
- }
-
- public abstract class Visibility extends androidx.transition.Transition {
- ctor public Visibility();
- ctor public Visibility(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public int getMode();
- method public boolean isVisible(androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public void setMode(int);
- field public static final int MODE_IN = 1; // 0x1
- field public static final int MODE_OUT = 2; // 0x2
- }
-
- public abstract class VisibilityPropagation extends androidx.transition.TransitionPropagation {
- ctor public VisibilityPropagation();
- method public void captureValues(androidx.transition.TransitionValues!);
- method public String![]! getPropagationProperties();
- method public int getViewVisibility(androidx.transition.TransitionValues!);
- method public int getViewX(androidx.transition.TransitionValues!);
- method public int getViewY(androidx.transition.TransitionValues!);
- }
-
-}
-
diff --git a/transition/transition/api/api_lint.ignore b/transition/transition/api/api_lint.ignore
index 93e0b43..e966073 100644
--- a/transition/transition/api/api_lint.ignore
+++ b/transition/transition/api/api_lint.ignore
@@ -73,6 +73,8 @@
Missing nullability on parameter `startValues` in method `onDisappear`
MissingNullability: androidx.transition.Slide#onDisappear(android.view.ViewGroup, android.view.View, androidx.transition.TransitionValues, androidx.transition.TransitionValues) parameter #3:
Missing nullability on parameter `endValues` in method `onDisappear`
+MissingNullability: androidx.transition.Transition#clone():
+ Missing nullability on method `clone` return
MissingNullability: androidx.transition.Transition#setMatchOrder(int...) parameter #0:
Missing nullability on parameter `matches` in method `setMatchOrder`
MissingNullability: androidx.transition.Transition.EpicenterCallback#onGetEpicenter(androidx.transition.Transition):
@@ -97,6 +99,8 @@
Missing nullability on parameter `startValues` in method `getStartDelay`
MissingNullability: androidx.transition.TransitionPropagation#getStartDelay(android.view.ViewGroup, androidx.transition.Transition, androidx.transition.TransitionValues, androidx.transition.TransitionValues) parameter #3:
Missing nullability on parameter `endValues` in method `getStartDelay`
+MissingNullability: androidx.transition.TransitionSet#clone():
+ Missing nullability on method `clone` return
MissingNullability: androidx.transition.TransitionSet#setEpicenterCallback(androidx.transition.Transition.EpicenterCallback) parameter #0:
Missing nullability on parameter `epicenterCallback` in method `setEpicenterCallback`
MissingNullability: androidx.transition.TransitionSet#setPathMotion(androidx.transition.PathMotion) parameter #0:
diff --git a/transition/transition/api/current.txt b/transition/transition/api/current.txt
index d5d8dbf..e314794 100644
--- a/transition/transition/api/current.txt
+++ b/transition/transition/api/current.txt
@@ -130,8 +130,8 @@
method public androidx.transition.Transition addTarget(Class<?>);
method public abstract void captureEndValues(androidx.transition.TransitionValues);
method public abstract void captureStartValues(androidx.transition.TransitionValues);
- method public androidx.transition.Transition clone();
- method public androidx.core.animation.Animator? createAnimator(android.view.ViewGroup, androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
+ method public androidx.transition.Transition! clone();
+ method public android.animation.Animator? createAnimator(android.view.ViewGroup, androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
method public androidx.transition.Transition excludeChildren(android.view.View, boolean);
method public androidx.transition.Transition excludeChildren(@IdRes int, boolean);
method public androidx.transition.Transition excludeChildren(Class<?>, boolean);
@@ -142,7 +142,7 @@
method public long getDuration();
method public android.graphics.Rect? getEpicenter();
method public androidx.transition.Transition.EpicenterCallback? getEpicenterCallback();
- method public androidx.core.animation.Interpolator? getInterpolator();
+ method public android.animation.TimeInterpolator? getInterpolator();
method public String getName();
method public androidx.transition.PathMotion getPathMotion();
method public androidx.transition.TransitionPropagation? getPropagation();
@@ -161,7 +161,7 @@
method public androidx.transition.Transition removeTarget(Class<?>);
method public androidx.transition.Transition setDuration(long);
method public void setEpicenterCallback(androidx.transition.Transition.EpicenterCallback?);
- method public androidx.transition.Transition setInterpolator(androidx.core.animation.Interpolator?);
+ method public androidx.transition.Transition setInterpolator(android.animation.TimeInterpolator?);
method public void setMatchOrder(int...);
method public void setPathMotion(androidx.transition.PathMotion?);
method public void setPropagation(androidx.transition.TransitionPropagation?);
@@ -240,7 +240,7 @@
method public androidx.transition.TransitionSet removeTarget(String);
method public androidx.transition.TransitionSet removeTransition(androidx.transition.Transition);
method public androidx.transition.TransitionSet setDuration(long);
- method public androidx.transition.TransitionSet setInterpolator(androidx.core.animation.Interpolator?);
+ method public androidx.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator?);
method public androidx.transition.TransitionSet setOrdering(int);
method public androidx.transition.TransitionSet setStartDelay(long);
field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
@@ -261,10 +261,10 @@
method public void captureStartValues(androidx.transition.TransitionValues);
method public int getMode();
method public boolean isVisible(androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
+ method public android.animation.Animator? onAppear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
+ method public android.animation.Animator? onAppear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
+ method public android.animation.Animator? onDisappear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
+ method public android.animation.Animator? onDisappear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
method public void setMode(int);
field public static final int MODE_IN = 1; // 0x1
field public static final int MODE_OUT = 2; // 0x2
diff --git a/transition/transition/api/public_plus_experimental_2.0.0-alpha01.txt b/transition/transition/api/public_plus_experimental_2.0.0-alpha01.txt
deleted file mode 100644
index d5d8dbf..0000000
--- a/transition/transition/api/public_plus_experimental_2.0.0-alpha01.txt
+++ /dev/null
@@ -1,283 +0,0 @@
-// Signature format: 3.0
-package androidx.transition {
-
- public class ArcMotion extends androidx.transition.PathMotion {
- ctor public ArcMotion();
- ctor public ArcMotion(android.content.Context, android.util.AttributeSet);
- method public float getMaximumAngle();
- method public float getMinimumHorizontalAngle();
- method public float getMinimumVerticalAngle();
- method public android.graphics.Path getPath(float, float, float, float);
- method public void setMaximumAngle(float);
- method public void setMinimumHorizontalAngle(float);
- method public void setMinimumVerticalAngle(float);
- }
-
- public class AutoTransition extends androidx.transition.TransitionSet {
- ctor public AutoTransition();
- ctor public AutoTransition(android.content.Context, android.util.AttributeSet);
- }
-
- public class ChangeBounds extends androidx.transition.Transition {
- ctor public ChangeBounds();
- ctor public ChangeBounds(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public boolean getResizeClip();
- method public void setResizeClip(boolean);
- }
-
- public class ChangeClipBounds extends androidx.transition.Transition {
- ctor public ChangeClipBounds();
- ctor public ChangeClipBounds(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- }
-
- public class ChangeImageTransform extends androidx.transition.Transition {
- ctor public ChangeImageTransform();
- ctor public ChangeImageTransform(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- }
-
- public class ChangeScroll extends androidx.transition.Transition {
- ctor public ChangeScroll();
- ctor public ChangeScroll(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- }
-
- public class ChangeTransform extends androidx.transition.Transition {
- ctor public ChangeTransform();
- ctor public ChangeTransform(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public boolean getReparent();
- method public boolean getReparentWithOverlay();
- method public void setReparent(boolean);
- method public void setReparentWithOverlay(boolean);
- }
-
- public class CircularPropagation extends androidx.transition.VisibilityPropagation {
- ctor public CircularPropagation();
- method public long getStartDelay(android.view.ViewGroup!, androidx.transition.Transition!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public void setPropagationSpeed(float);
- }
-
- public class Explode extends androidx.transition.Visibility {
- ctor public Explode();
- ctor public Explode(android.content.Context, android.util.AttributeSet);
- }
-
- public class Fade extends androidx.transition.Visibility {
- ctor public Fade(int);
- ctor public Fade();
- ctor public Fade(android.content.Context, android.util.AttributeSet);
- field public static final int IN = 1; // 0x1
- field public static final int OUT = 2; // 0x2
- }
-
- public abstract class PathMotion {
- ctor public PathMotion();
- ctor public PathMotion(android.content.Context, android.util.AttributeSet);
- method public abstract android.graphics.Path getPath(float, float, float, float);
- }
-
- public class PatternPathMotion extends androidx.transition.PathMotion {
- ctor public PatternPathMotion();
- ctor public PatternPathMotion(android.content.Context, android.util.AttributeSet);
- ctor public PatternPathMotion(android.graphics.Path!);
- method public android.graphics.Path getPath(float, float, float, float);
- method public android.graphics.Path! getPatternPath();
- method public void setPatternPath(android.graphics.Path!);
- }
-
- public class Scene {
- ctor public Scene(android.view.ViewGroup);
- ctor public Scene(android.view.ViewGroup, android.view.View);
- method public void enter();
- method public void exit();
- method public static androidx.transition.Scene? getCurrentScene(android.view.ViewGroup);
- method public static androidx.transition.Scene getSceneForLayout(android.view.ViewGroup, @LayoutRes int, android.content.Context);
- method public android.view.ViewGroup getSceneRoot();
- method public void setEnterAction(Runnable?);
- method public void setExitAction(Runnable?);
- }
-
- public class SidePropagation extends androidx.transition.VisibilityPropagation {
- ctor public SidePropagation();
- method public long getStartDelay(android.view.ViewGroup!, androidx.transition.Transition!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public void setPropagationSpeed(float);
- method public void setSide(int);
- }
-
- public class Slide extends androidx.transition.Visibility {
- ctor public Slide();
- ctor public Slide(int);
- ctor public Slide(android.content.Context, android.util.AttributeSet);
- method public int getSlideEdge();
- method public void setSlideEdge(int);
- }
-
- public abstract class Transition implements java.lang.Cloneable {
- ctor public Transition();
- ctor public Transition(android.content.Context, android.util.AttributeSet);
- method public androidx.transition.Transition addListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.Transition addTarget(android.view.View);
- method public androidx.transition.Transition addTarget(@IdRes int);
- method public androidx.transition.Transition addTarget(String);
- method public androidx.transition.Transition addTarget(Class<?>);
- method public abstract void captureEndValues(androidx.transition.TransitionValues);
- method public abstract void captureStartValues(androidx.transition.TransitionValues);
- method public androidx.transition.Transition clone();
- method public androidx.core.animation.Animator? createAnimator(android.view.ViewGroup, androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
- method public androidx.transition.Transition excludeChildren(android.view.View, boolean);
- method public androidx.transition.Transition excludeChildren(@IdRes int, boolean);
- method public androidx.transition.Transition excludeChildren(Class<?>, boolean);
- method public androidx.transition.Transition excludeTarget(android.view.View, boolean);
- method public androidx.transition.Transition excludeTarget(@IdRes int, boolean);
- method public androidx.transition.Transition excludeTarget(String, boolean);
- method public androidx.transition.Transition excludeTarget(Class<?>, boolean);
- method public long getDuration();
- method public android.graphics.Rect? getEpicenter();
- method public androidx.transition.Transition.EpicenterCallback? getEpicenterCallback();
- method public androidx.core.animation.Interpolator? getInterpolator();
- method public String getName();
- method public androidx.transition.PathMotion getPathMotion();
- method public androidx.transition.TransitionPropagation? getPropagation();
- method public long getStartDelay();
- method public java.util.List<java.lang.Integer!> getTargetIds();
- method public java.util.List<java.lang.String!>? getTargetNames();
- method public java.util.List<java.lang.Class<?>!>? getTargetTypes();
- method public java.util.List<android.view.View!> getTargets();
- method public String![]? getTransitionProperties();
- method public androidx.transition.TransitionValues? getTransitionValues(android.view.View, boolean);
- method public boolean isTransitionRequired(androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
- method public androidx.transition.Transition removeListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.Transition removeTarget(android.view.View);
- method public androidx.transition.Transition removeTarget(@IdRes int);
- method public androidx.transition.Transition removeTarget(String);
- method public androidx.transition.Transition removeTarget(Class<?>);
- method public androidx.transition.Transition setDuration(long);
- method public void setEpicenterCallback(androidx.transition.Transition.EpicenterCallback?);
- method public androidx.transition.Transition setInterpolator(androidx.core.animation.Interpolator?);
- method public void setMatchOrder(int...);
- method public void setPathMotion(androidx.transition.PathMotion?);
- method public void setPropagation(androidx.transition.TransitionPropagation?);
- method public androidx.transition.Transition setStartDelay(long);
- field public static final int MATCH_ID = 3; // 0x3
- field public static final int MATCH_INSTANCE = 1; // 0x1
- field public static final int MATCH_ITEM_ID = 4; // 0x4
- field public static final int MATCH_NAME = 2; // 0x2
- }
-
- public abstract static class Transition.EpicenterCallback {
- ctor public Transition.EpicenterCallback();
- method public abstract android.graphics.Rect! onGetEpicenter(androidx.transition.Transition);
- }
-
- public static interface Transition.TransitionListener {
- method public void onTransitionCancel(androidx.transition.Transition);
- method public void onTransitionEnd(androidx.transition.Transition);
- method public void onTransitionPause(androidx.transition.Transition);
- method public void onTransitionResume(androidx.transition.Transition);
- method public void onTransitionStart(androidx.transition.Transition);
- }
-
- public class TransitionInflater {
- method public static androidx.transition.TransitionInflater from(android.content.Context);
- method public androidx.transition.Transition! inflateTransition(int);
- method public androidx.transition.TransitionManager! inflateTransitionManager(int, android.view.ViewGroup!);
- }
-
- public class TransitionListenerAdapter implements androidx.transition.Transition.TransitionListener {
- ctor public TransitionListenerAdapter();
- method public void onTransitionCancel(androidx.transition.Transition);
- method public void onTransitionEnd(androidx.transition.Transition);
- method public void onTransitionPause(androidx.transition.Transition);
- method public void onTransitionResume(androidx.transition.Transition);
- method public void onTransitionStart(androidx.transition.Transition);
- }
-
- public class TransitionManager {
- ctor public TransitionManager();
- method public static void beginDelayedTransition(android.view.ViewGroup);
- method public static void beginDelayedTransition(android.view.ViewGroup, androidx.transition.Transition?);
- method public static void endTransitions(android.view.ViewGroup!);
- method public static void go(androidx.transition.Scene);
- method public static void go(androidx.transition.Scene, androidx.transition.Transition?);
- method public void setTransition(androidx.transition.Scene, androidx.transition.Transition?);
- method public void setTransition(androidx.transition.Scene, androidx.transition.Scene, androidx.transition.Transition?);
- method public void transitionTo(androidx.transition.Scene);
- }
-
- public abstract class TransitionPropagation {
- ctor public TransitionPropagation();
- method public abstract void captureValues(androidx.transition.TransitionValues!);
- method public abstract String![]! getPropagationProperties();
- method public abstract long getStartDelay(android.view.ViewGroup!, androidx.transition.Transition!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- }
-
- public class TransitionSet extends androidx.transition.Transition {
- ctor public TransitionSet();
- ctor public TransitionSet(android.content.Context, android.util.AttributeSet);
- method public androidx.transition.TransitionSet addListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.TransitionSet addTarget(android.view.View);
- method public androidx.transition.TransitionSet addTarget(@IdRes int);
- method public androidx.transition.TransitionSet addTarget(String);
- method public androidx.transition.TransitionSet addTarget(Class<?>);
- method public androidx.transition.TransitionSet addTransition(androidx.transition.Transition);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public int getOrdering();
- method public androidx.transition.Transition? getTransitionAt(int);
- method public int getTransitionCount();
- method public androidx.transition.TransitionSet removeListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.TransitionSet removeTarget(@IdRes int);
- method public androidx.transition.TransitionSet removeTarget(android.view.View);
- method public androidx.transition.TransitionSet removeTarget(Class<?>);
- method public androidx.transition.TransitionSet removeTarget(String);
- method public androidx.transition.TransitionSet removeTransition(androidx.transition.Transition);
- method public androidx.transition.TransitionSet setDuration(long);
- method public androidx.transition.TransitionSet setInterpolator(androidx.core.animation.Interpolator?);
- method public androidx.transition.TransitionSet setOrdering(int);
- method public androidx.transition.TransitionSet setStartDelay(long);
- field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
- field public static final int ORDERING_TOGETHER = 0; // 0x0
- }
-
- public class TransitionValues {
- ctor @Deprecated public TransitionValues();
- ctor public TransitionValues(android.view.View);
- field public final java.util.Map<java.lang.String!,java.lang.Object!>! values;
- field public android.view.View! view;
- }
-
- public abstract class Visibility extends androidx.transition.Transition {
- ctor public Visibility();
- ctor public Visibility(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public int getMode();
- method public boolean isVisible(androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public void setMode(int);
- field public static final int MODE_IN = 1; // 0x1
- field public static final int MODE_OUT = 2; // 0x2
- }
-
- public abstract class VisibilityPropagation extends androidx.transition.TransitionPropagation {
- ctor public VisibilityPropagation();
- method public void captureValues(androidx.transition.TransitionValues!);
- method public String![]! getPropagationProperties();
- method public int getViewVisibility(androidx.transition.TransitionValues!);
- method public int getViewX(androidx.transition.TransitionValues!);
- method public int getViewY(androidx.transition.TransitionValues!);
- }
-
-}
-
diff --git a/transition/transition/api/public_plus_experimental_current.txt b/transition/transition/api/public_plus_experimental_current.txt
index d5d8dbf..e314794 100644
--- a/transition/transition/api/public_plus_experimental_current.txt
+++ b/transition/transition/api/public_plus_experimental_current.txt
@@ -130,8 +130,8 @@
method public androidx.transition.Transition addTarget(Class<?>);
method public abstract void captureEndValues(androidx.transition.TransitionValues);
method public abstract void captureStartValues(androidx.transition.TransitionValues);
- method public androidx.transition.Transition clone();
- method public androidx.core.animation.Animator? createAnimator(android.view.ViewGroup, androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
+ method public androidx.transition.Transition! clone();
+ method public android.animation.Animator? createAnimator(android.view.ViewGroup, androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
method public androidx.transition.Transition excludeChildren(android.view.View, boolean);
method public androidx.transition.Transition excludeChildren(@IdRes int, boolean);
method public androidx.transition.Transition excludeChildren(Class<?>, boolean);
@@ -142,7 +142,7 @@
method public long getDuration();
method public android.graphics.Rect? getEpicenter();
method public androidx.transition.Transition.EpicenterCallback? getEpicenterCallback();
- method public androidx.core.animation.Interpolator? getInterpolator();
+ method public android.animation.TimeInterpolator? getInterpolator();
method public String getName();
method public androidx.transition.PathMotion getPathMotion();
method public androidx.transition.TransitionPropagation? getPropagation();
@@ -161,7 +161,7 @@
method public androidx.transition.Transition removeTarget(Class<?>);
method public androidx.transition.Transition setDuration(long);
method public void setEpicenterCallback(androidx.transition.Transition.EpicenterCallback?);
- method public androidx.transition.Transition setInterpolator(androidx.core.animation.Interpolator?);
+ method public androidx.transition.Transition setInterpolator(android.animation.TimeInterpolator?);
method public void setMatchOrder(int...);
method public void setPathMotion(androidx.transition.PathMotion?);
method public void setPropagation(androidx.transition.TransitionPropagation?);
@@ -240,7 +240,7 @@
method public androidx.transition.TransitionSet removeTarget(String);
method public androidx.transition.TransitionSet removeTransition(androidx.transition.Transition);
method public androidx.transition.TransitionSet setDuration(long);
- method public androidx.transition.TransitionSet setInterpolator(androidx.core.animation.Interpolator?);
+ method public androidx.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator?);
method public androidx.transition.TransitionSet setOrdering(int);
method public androidx.transition.TransitionSet setStartDelay(long);
field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
@@ -261,10 +261,10 @@
method public void captureStartValues(androidx.transition.TransitionValues);
method public int getMode();
method public boolean isVisible(androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
+ method public android.animation.Animator? onAppear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
+ method public android.animation.Animator? onAppear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
+ method public android.animation.Animator? onDisappear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
+ method public android.animation.Animator? onDisappear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
method public void setMode(int);
field public static final int MODE_IN = 1; // 0x1
field public static final int MODE_OUT = 2; // 0x2
diff --git a/transition/transition/api/res-2.0.0-alpha01.txt b/transition/transition/api/res-2.0.0-alpha01.txt
deleted file mode 100644
index e69de29..0000000
--- a/transition/transition/api/res-2.0.0-alpha01.txt
+++ /dev/null
diff --git a/transition/transition/api/restricted_2.0.0-alpha01.txt b/transition/transition/api/restricted_2.0.0-alpha01.txt
deleted file mode 100644
index eec52d6..0000000
--- a/transition/transition/api/restricted_2.0.0-alpha01.txt
+++ /dev/null
@@ -1,320 +0,0 @@
-// Signature format: 3.0
-package androidx.transition {
-
- public class ArcMotion extends androidx.transition.PathMotion {
- ctor public ArcMotion();
- ctor public ArcMotion(android.content.Context, android.util.AttributeSet);
- method public float getMaximumAngle();
- method public float getMinimumHorizontalAngle();
- method public float getMinimumVerticalAngle();
- method public android.graphics.Path getPath(float, float, float, float);
- method public void setMaximumAngle(float);
- method public void setMinimumHorizontalAngle(float);
- method public void setMinimumVerticalAngle(float);
- }
-
- public class AutoTransition extends androidx.transition.TransitionSet {
- ctor public AutoTransition();
- ctor public AutoTransition(android.content.Context, android.util.AttributeSet);
- }
-
- public class ChangeBounds extends androidx.transition.Transition {
- ctor public ChangeBounds();
- ctor public ChangeBounds(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public boolean getResizeClip();
- method public void setResizeClip(boolean);
- }
-
- public class ChangeClipBounds extends androidx.transition.Transition {
- ctor public ChangeClipBounds();
- ctor public ChangeClipBounds(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- }
-
- public class ChangeImageTransform extends androidx.transition.Transition {
- ctor public ChangeImageTransform();
- ctor public ChangeImageTransform(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- }
-
- public class ChangeScroll extends androidx.transition.Transition {
- ctor public ChangeScroll();
- ctor public ChangeScroll(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- }
-
- public class ChangeTransform extends androidx.transition.Transition {
- ctor public ChangeTransform();
- ctor public ChangeTransform(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public boolean getReparent();
- method public boolean getReparentWithOverlay();
- method public void setReparent(boolean);
- method public void setReparentWithOverlay(boolean);
- }
-
- public class CircularPropagation extends androidx.transition.VisibilityPropagation {
- ctor public CircularPropagation();
- method public long getStartDelay(android.view.ViewGroup!, androidx.transition.Transition!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public void setPropagationSpeed(float);
- }
-
- public class Explode extends androidx.transition.Visibility {
- ctor public Explode();
- ctor public Explode(android.content.Context, android.util.AttributeSet);
- }
-
- public class Fade extends androidx.transition.Visibility {
- ctor public Fade(@androidx.transition.Visibility.Mode int);
- ctor public Fade();
- ctor public Fade(android.content.Context, android.util.AttributeSet);
- field public static final int IN = 1; // 0x1
- field public static final int OUT = 2; // 0x2
- }
-
- @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FragmentTransitionSupport extends androidx.fragment.app.FragmentTransitionImpl {
- ctor public FragmentTransitionSupport();
- method public void addTarget(Object!, android.view.View!);
- method public void addTargets(Object!, java.util.ArrayList<android.view.View!>!);
- method public void beginDelayedTransition(android.view.ViewGroup!, Object!);
- method public boolean canHandle(Object!);
- method public Object! cloneTransition(Object!);
- method public Object! mergeTransitionsInSequence(Object!, Object!, Object!);
- method public Object! mergeTransitionsTogether(Object!, Object!, Object!);
- method public void removeTarget(Object!, android.view.View!);
- method public void replaceTargets(Object!, java.util.ArrayList<android.view.View!>!, java.util.ArrayList<android.view.View!>!);
- method public void scheduleHideFragmentView(Object!, android.view.View!, java.util.ArrayList<android.view.View!>!);
- method public void scheduleRemoveTargets(Object!, Object!, java.util.ArrayList<android.view.View!>!, Object!, java.util.ArrayList<android.view.View!>!, Object!, java.util.ArrayList<android.view.View!>!);
- method public void setEpicenter(Object!, android.view.View!);
- method public void setEpicenter(Object!, android.graphics.Rect!);
- method public void setSharedElementTargets(Object!, android.view.View!, java.util.ArrayList<android.view.View!>!);
- method public void swapSharedElementTargets(Object!, java.util.ArrayList<android.view.View!>!, java.util.ArrayList<android.view.View!>!);
- method public Object! wrapTransitionInSet(Object!);
- }
-
- public abstract class PathMotion {
- ctor public PathMotion();
- ctor public PathMotion(android.content.Context, android.util.AttributeSet);
- method public abstract android.graphics.Path getPath(float, float, float, float);
- }
-
- public class PatternPathMotion extends androidx.transition.PathMotion {
- ctor public PatternPathMotion();
- ctor public PatternPathMotion(android.content.Context, android.util.AttributeSet);
- ctor public PatternPathMotion(android.graphics.Path!);
- method public android.graphics.Path getPath(float, float, float, float);
- method public android.graphics.Path! getPatternPath();
- method public void setPatternPath(android.graphics.Path!);
- }
-
- public class Scene {
- ctor public Scene(android.view.ViewGroup);
- ctor public Scene(android.view.ViewGroup, android.view.View);
- method public void enter();
- method public void exit();
- method public static androidx.transition.Scene? getCurrentScene(android.view.ViewGroup);
- method public static androidx.transition.Scene getSceneForLayout(android.view.ViewGroup, @LayoutRes int, android.content.Context);
- method public android.view.ViewGroup getSceneRoot();
- method public void setEnterAction(Runnable?);
- method public void setExitAction(Runnable?);
- }
-
- public class SidePropagation extends androidx.transition.VisibilityPropagation {
- ctor public SidePropagation();
- method public long getStartDelay(android.view.ViewGroup!, androidx.transition.Transition!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public void setPropagationSpeed(float);
- method public void setSide(@androidx.transition.Slide.GravityFlag int);
- }
-
- public class Slide extends androidx.transition.Visibility {
- ctor public Slide();
- ctor public Slide(@androidx.transition.Slide.GravityFlag int);
- ctor public Slide(android.content.Context, android.util.AttributeSet);
- method @androidx.transition.Slide.GravityFlag public int getSlideEdge();
- method public void setSlideEdge(@androidx.transition.Slide.GravityFlag int);
- }
-
- @IntDef({android.view.Gravity.LEFT, android.view.Gravity.TOP, android.view.Gravity.RIGHT, android.view.Gravity.BOTTOM, android.view.Gravity.START, android.view.Gravity.END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface Slide.GravityFlag {
- }
-
- public abstract class Transition implements java.lang.Cloneable {
- ctor public Transition();
- ctor public Transition(android.content.Context, android.util.AttributeSet);
- method public androidx.transition.Transition addListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.Transition addTarget(android.view.View);
- method public androidx.transition.Transition addTarget(@IdRes int);
- method public androidx.transition.Transition addTarget(String);
- method public androidx.transition.Transition addTarget(Class<?>);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void animate(androidx.core.animation.Animator!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void cancel();
- method public abstract void captureEndValues(androidx.transition.TransitionValues);
- method public abstract void captureStartValues(androidx.transition.TransitionValues);
- method public androidx.transition.Transition clone();
- method public androidx.core.animation.Animator? createAnimator(android.view.ViewGroup, androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void createAnimators(android.view.ViewGroup!, androidx.transition.TransitionValuesMaps!, androidx.transition.TransitionValuesMaps!, java.util.ArrayList<androidx.transition.TransitionValues!>!, java.util.ArrayList<androidx.transition.TransitionValues!>!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void end();
- method public androidx.transition.Transition excludeChildren(android.view.View, boolean);
- method public androidx.transition.Transition excludeChildren(@IdRes int, boolean);
- method public androidx.transition.Transition excludeChildren(Class<?>, boolean);
- method public androidx.transition.Transition excludeTarget(android.view.View, boolean);
- method public androidx.transition.Transition excludeTarget(@IdRes int, boolean);
- method public androidx.transition.Transition excludeTarget(String, boolean);
- method public androidx.transition.Transition excludeTarget(Class<?>, boolean);
- method public long getDuration();
- method public android.graphics.Rect? getEpicenter();
- method public androidx.transition.Transition.EpicenterCallback? getEpicenterCallback();
- method public androidx.core.animation.Interpolator? getInterpolator();
- method public String getName();
- method public androidx.transition.PathMotion getPathMotion();
- method public androidx.transition.TransitionPropagation? getPropagation();
- method public long getStartDelay();
- method public java.util.List<java.lang.Integer!> getTargetIds();
- method public java.util.List<java.lang.String!>? getTargetNames();
- method public java.util.List<java.lang.Class<?>!>? getTargetTypes();
- method public java.util.List<android.view.View!> getTargets();
- method public String![]? getTransitionProperties();
- method public androidx.transition.TransitionValues? getTransitionValues(android.view.View, boolean);
- method public boolean isTransitionRequired(androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void pause(android.view.View!);
- method public androidx.transition.Transition removeListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.Transition removeTarget(android.view.View);
- method public androidx.transition.Transition removeTarget(@IdRes int);
- method public androidx.transition.Transition removeTarget(String);
- method public androidx.transition.Transition removeTarget(Class<?>);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void resume(android.view.View!);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void runAnimators();
- method public androidx.transition.Transition setDuration(long);
- method public void setEpicenterCallback(androidx.transition.Transition.EpicenterCallback?);
- method public androidx.transition.Transition setInterpolator(androidx.core.animation.Interpolator?);
- method public void setMatchOrder(@androidx.transition.Transition.MatchOrder int...);
- method public void setPathMotion(androidx.transition.PathMotion?);
- method public void setPropagation(androidx.transition.TransitionPropagation?);
- method public androidx.transition.Transition setStartDelay(long);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void start();
- field public static final int MATCH_ID = 3; // 0x3
- field public static final int MATCH_INSTANCE = 1; // 0x1
- field public static final int MATCH_ITEM_ID = 4; // 0x4
- field public static final int MATCH_NAME = 2; // 0x2
- }
-
- public abstract static class Transition.EpicenterCallback {
- ctor public Transition.EpicenterCallback();
- method public abstract android.graphics.Rect! onGetEpicenter(androidx.transition.Transition);
- }
-
- @IntDef({androidx.transition.Transition.MATCH_INSTANCE, androidx.transition.Transition.MATCH_NAME, androidx.transition.Transition.MATCH_ID, androidx.transition.Transition.MATCH_ITEM_ID}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface Transition.MatchOrder {
- }
-
- public static interface Transition.TransitionListener {
- method public void onTransitionCancel(androidx.transition.Transition);
- method public void onTransitionEnd(androidx.transition.Transition);
- method public void onTransitionPause(androidx.transition.Transition);
- method public void onTransitionResume(androidx.transition.Transition);
- method public void onTransitionStart(androidx.transition.Transition);
- }
-
- public class TransitionInflater {
- method public static androidx.transition.TransitionInflater from(android.content.Context);
- method public androidx.transition.Transition! inflateTransition(int);
- method public androidx.transition.TransitionManager! inflateTransitionManager(int, android.view.ViewGroup!);
- }
-
- public class TransitionListenerAdapter implements androidx.transition.Transition.TransitionListener {
- ctor public TransitionListenerAdapter();
- method public void onTransitionCancel(androidx.transition.Transition);
- method public void onTransitionEnd(androidx.transition.Transition);
- method public void onTransitionPause(androidx.transition.Transition);
- method public void onTransitionResume(androidx.transition.Transition);
- method public void onTransitionStart(androidx.transition.Transition);
- }
-
- public class TransitionManager {
- ctor public TransitionManager();
- method public static void beginDelayedTransition(android.view.ViewGroup);
- method public static void beginDelayedTransition(android.view.ViewGroup, androidx.transition.Transition?);
- method public static void endTransitions(android.view.ViewGroup!);
- method public static void go(androidx.transition.Scene);
- method public static void go(androidx.transition.Scene, androidx.transition.Transition?);
- method public void setTransition(androidx.transition.Scene, androidx.transition.Transition?);
- method public void setTransition(androidx.transition.Scene, androidx.transition.Scene, androidx.transition.Transition?);
- method public void transitionTo(androidx.transition.Scene);
- }
-
- public abstract class TransitionPropagation {
- ctor public TransitionPropagation();
- method public abstract void captureValues(androidx.transition.TransitionValues!);
- method public abstract String![]! getPropagationProperties();
- method public abstract long getStartDelay(android.view.ViewGroup!, androidx.transition.Transition!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- }
-
- public class TransitionSet extends androidx.transition.Transition {
- ctor public TransitionSet();
- ctor public TransitionSet(android.content.Context, android.util.AttributeSet);
- method public androidx.transition.TransitionSet addListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.TransitionSet addTarget(android.view.View);
- method public androidx.transition.TransitionSet addTarget(@IdRes int);
- method public androidx.transition.TransitionSet addTarget(String);
- method public androidx.transition.TransitionSet addTarget(Class<?>);
- method public androidx.transition.TransitionSet addTransition(androidx.transition.Transition);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method public int getOrdering();
- method public androidx.transition.Transition? getTransitionAt(int);
- method public int getTransitionCount();
- method public androidx.transition.TransitionSet removeListener(androidx.transition.Transition.TransitionListener);
- method public androidx.transition.TransitionSet removeTarget(@IdRes int);
- method public androidx.transition.TransitionSet removeTarget(android.view.View);
- method public androidx.transition.TransitionSet removeTarget(Class<?>);
- method public androidx.transition.TransitionSet removeTarget(String);
- method public androidx.transition.TransitionSet removeTransition(androidx.transition.Transition);
- method public androidx.transition.TransitionSet setDuration(long);
- method public androidx.transition.TransitionSet setInterpolator(androidx.core.animation.Interpolator?);
- method public androidx.transition.TransitionSet setOrdering(int);
- method public androidx.transition.TransitionSet setStartDelay(long);
- field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
- field public static final int ORDERING_TOGETHER = 0; // 0x0
- }
-
- public class TransitionValues {
- ctor @Deprecated public TransitionValues();
- ctor public TransitionValues(android.view.View);
- field public final java.util.Map<java.lang.String!,java.lang.Object!>! values;
- field public android.view.View! view;
- }
-
- public abstract class Visibility extends androidx.transition.Transition {
- ctor public Visibility();
- ctor public Visibility(android.content.Context, android.util.AttributeSet);
- method public void captureEndValues(androidx.transition.TransitionValues);
- method public void captureStartValues(androidx.transition.TransitionValues);
- method @androidx.transition.Visibility.Mode public int getMode();
- method public boolean isVisible(androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public void setMode(@androidx.transition.Visibility.Mode int);
- field public static final int MODE_IN = 1; // 0x1
- field public static final int MODE_OUT = 2; // 0x2
- }
-
- @IntDef(flag=true, value={androidx.transition.Visibility.MODE_IN, androidx.transition.Visibility.MODE_OUT, androidx.transition.Fade.IN, androidx.transition.Fade.OUT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface Visibility.Mode {
- }
-
- public abstract class VisibilityPropagation extends androidx.transition.TransitionPropagation {
- ctor public VisibilityPropagation();
- method public void captureValues(androidx.transition.TransitionValues!);
- method public String![]! getPropagationProperties();
- method public int getViewVisibility(androidx.transition.TransitionValues!);
- method public int getViewX(androidx.transition.TransitionValues!);
- method public int getViewY(androidx.transition.TransitionValues!);
- }
-
-}
-
diff --git a/transition/transition/api/restricted_current.txt b/transition/transition/api/restricted_current.txt
index eec52d6..fdce88d 100644
--- a/transition/transition/api/restricted_current.txt
+++ b/transition/transition/api/restricted_current.txt
@@ -151,12 +151,12 @@
method public androidx.transition.Transition addTarget(@IdRes int);
method public androidx.transition.Transition addTarget(String);
method public androidx.transition.Transition addTarget(Class<?>);
- method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void animate(androidx.core.animation.Animator!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void animate(android.animation.Animator!);
method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void cancel();
method public abstract void captureEndValues(androidx.transition.TransitionValues);
method public abstract void captureStartValues(androidx.transition.TransitionValues);
- method public androidx.transition.Transition clone();
- method public androidx.core.animation.Animator? createAnimator(android.view.ViewGroup, androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
+ method public androidx.transition.Transition! clone();
+ method public android.animation.Animator? createAnimator(android.view.ViewGroup, androidx.transition.TransitionValues?, androidx.transition.TransitionValues?);
method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void createAnimators(android.view.ViewGroup!, androidx.transition.TransitionValuesMaps!, androidx.transition.TransitionValuesMaps!, java.util.ArrayList<androidx.transition.TransitionValues!>!, java.util.ArrayList<androidx.transition.TransitionValues!>!);
method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void end();
method public androidx.transition.Transition excludeChildren(android.view.View, boolean);
@@ -169,7 +169,7 @@
method public long getDuration();
method public android.graphics.Rect? getEpicenter();
method public androidx.transition.Transition.EpicenterCallback? getEpicenterCallback();
- method public androidx.core.animation.Interpolator? getInterpolator();
+ method public android.animation.TimeInterpolator? getInterpolator();
method public String getName();
method public androidx.transition.PathMotion getPathMotion();
method public androidx.transition.TransitionPropagation? getPropagation();
@@ -191,7 +191,7 @@
method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void runAnimators();
method public androidx.transition.Transition setDuration(long);
method public void setEpicenterCallback(androidx.transition.Transition.EpicenterCallback?);
- method public androidx.transition.Transition setInterpolator(androidx.core.animation.Interpolator?);
+ method public androidx.transition.Transition setInterpolator(android.animation.TimeInterpolator?);
method public void setMatchOrder(@androidx.transition.Transition.MatchOrder int...);
method public void setPathMotion(androidx.transition.PathMotion?);
method public void setPropagation(androidx.transition.TransitionPropagation?);
@@ -274,7 +274,7 @@
method public androidx.transition.TransitionSet removeTarget(String);
method public androidx.transition.TransitionSet removeTransition(androidx.transition.Transition);
method public androidx.transition.TransitionSet setDuration(long);
- method public androidx.transition.TransitionSet setInterpolator(androidx.core.animation.Interpolator?);
+ method public androidx.transition.TransitionSet setInterpolator(android.animation.TimeInterpolator?);
method public androidx.transition.TransitionSet setOrdering(int);
method public androidx.transition.TransitionSet setStartDelay(long);
field public static final int ORDERING_SEQUENTIAL = 1; // 0x1
@@ -295,10 +295,10 @@
method public void captureStartValues(androidx.transition.TransitionValues);
method @androidx.transition.Visibility.Mode public int getMode();
method public boolean isVisible(androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onAppear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
- method public androidx.core.animation.Animator? onDisappear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
+ method public android.animation.Animator? onAppear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
+ method public android.animation.Animator? onAppear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
+ method public android.animation.Animator? onDisappear(android.view.ViewGroup!, androidx.transition.TransitionValues!, int, androidx.transition.TransitionValues!, int);
+ method public android.animation.Animator? onDisappear(android.view.ViewGroup!, android.view.View!, androidx.transition.TransitionValues!, androidx.transition.TransitionValues!);
method public void setMode(@androidx.transition.Visibility.Mode int);
field public static final int MODE_IN = 1; // 0x1
field public static final int MODE_OUT = 2; // 0x2
diff --git a/transition/transition/build.gradle b/transition/transition/build.gradle
index 6d3f74d..7a5e169 100644
--- a/transition/transition/build.gradle
+++ b/transition/transition/build.gradle
@@ -13,7 +13,6 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
api("androidx.core:core:1.1.0")
- api(project(":core:core-animation"))
implementation("androidx.collection:collection:1.1.0")
compileOnly(project(":fragment:fragment"))
compileOnly("androidx.appcompat:appcompat:1.0.1")
@@ -38,8 +37,8 @@
android {
compileOptions {
- sourceCompatibility = JavaVersion.VERSION_1_8
- targetCompatibility = JavaVersion.VERSION_1_8
+ sourceCompatibility = JavaVersion.VERSION_1_7
+ targetCompatibility = JavaVersion.VERSION_1_7
}
buildTypes.all {
consumerProguardFiles 'proguard-rules.pro'
diff --git a/transition/transition/src/androidTest/java/androidx/transition/BaseTransitionTest.java b/transition/transition/src/androidTest/java/androidx/transition/BaseTransitionTest.java
index 5e25809..a8fc93e 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/BaseTransitionTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/BaseTransitionTest.java
@@ -21,12 +21,12 @@
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
-import androidx.core.animation.Animator;
-import androidx.core.animation.ObjectAnimator;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.testutils.AnimationDurationScaleRule;
import androidx.transition.test.R;
diff --git a/transition/transition/src/androidTest/java/androidx/transition/ChangeBoundsTest.java b/transition/transition/src/androidTest/java/androidx/transition/ChangeBoundsTest.java
index 97357e5..7e7f751 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/ChangeBoundsTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/ChangeBoundsTest.java
@@ -24,10 +24,10 @@
import android.content.Context;
import android.os.Build;
import android.view.View;
+import android.view.animation.LinearInterpolator;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
-import androidx.core.animation.LinearInterpolator;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.LargeTest;
import androidx.transition.test.R;
diff --git a/transition/transition/src/androidTest/java/androidx/transition/ChangeImageTransformTest.java b/transition/transition/src/androidTest/java/androidx/transition/ChangeImageTransformTest.java
index 6903822..6b3802f 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/ChangeImageTransformTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/ChangeImageTransformTest.java
@@ -25,6 +25,8 @@
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
@@ -37,8 +39,6 @@
import android.widget.ImageView;
import androidx.annotation.NonNull;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorListenerAdapter;
import androidx.core.app.ActivityCompat;
import androidx.test.filters.LargeTest;
import androidx.test.platform.app.InstrumentationRegistry;
@@ -372,12 +372,12 @@
}
@Override
- public void onAnimationStart(@NonNull Animator animation) {
+ public void onAnimationStart(Animator animation) {
mStartMatrix = copyMatrix();
}
@Override
- public void onAnimationEnd(@NonNull Animator animation) {
+ public void onAnimationEnd(Animator animation) {
mEndMatrix = copyMatrix();
}
diff --git a/transition/transition/src/androidTest/java/androidx/transition/FadeTest.java b/transition/transition/src/androidTest/java/androidx/transition/FadeTest.java
index 36fe4d5..fa58f8b 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/FadeTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/FadeTest.java
@@ -31,15 +31,15 @@
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.ObjectAnimator;
-import androidx.core.animation.ValueAnimator;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.LargeTest;
import androidx.test.platform.app.InstrumentationRegistry;
@@ -300,12 +300,11 @@
@Nullable final TransitionValues endValues) {
final Animator animator = super.createAnimator(sceneRoot, startValues, endValues);
if (animator instanceof ObjectAnimator) {
- animator.addUpdateListener(
+ ((ObjectAnimator) animator).addUpdateListener(
new ValueAnimator.AnimatorUpdateListener() {
@Override
- public void onAnimationUpdate(@NonNull Animator animation) {
- final ValueAnimator anim = (ValueAnimator) animation;
- final float alpha = (float) anim.getAnimatedValue();
+ public void onAnimationUpdate(ValueAnimator animation) {
+ final float alpha = (float) animation.getAnimatedValue();
mAlphaValues[1] = alpha;
if (mInitialAlpha < 0) {
mInitialAlpha = alpha;
diff --git a/transition/transition/src/androidTest/java/androidx/transition/PrevTransitionStoppedTest.java b/transition/transition/src/androidTest/java/androidx/transition/PrevTransitionStoppedTest.java
index 8050da9..873d8c6 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/PrevTransitionStoppedTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/PrevTransitionStoppedTest.java
@@ -21,12 +21,12 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import android.animation.Animator;
+import android.animation.ValueAnimator;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import androidx.core.animation.Animator;
-import androidx.core.animation.ValueAnimator;
import androidx.test.filters.MediumTest;
import androidx.transition.test.R;
diff --git a/transition/transition/src/androidTest/java/androidx/transition/PropagationTest.java b/transition/transition/src/androidTest/java/androidx/transition/PropagationTest.java
index a5a104d..8c6da69 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/PropagationTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/PropagationTest.java
@@ -23,6 +23,9 @@
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
import android.graphics.Rect;
import android.util.SparseArray;
import android.view.Gravity;
@@ -30,9 +33,6 @@
import android.view.ViewGroup;
import androidx.annotation.NonNull;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorListenerAdapter;
-import androidx.core.animation.ObjectAnimator;
import androidx.test.filters.MediumTest;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.transition.test.R;
@@ -111,7 +111,7 @@
final Animator anim = super.onDisappear(sceneRoot, view, startValues, endValues);
anim.addListener(new AnimatorListenerAdapter() {
@Override
- public void onAnimationStart(@NonNull Animator animation) {
+ public void onAnimationStart(Animator animation) {
final ObjectAnimator a = (ObjectAnimator) animation;
final int viewId = ((View) a.getTarget()).getId();
final long startDelay = a.getStartDelay();
diff --git a/transition/transition/src/androidTest/java/androidx/transition/TrackingVisibility.java b/transition/transition/src/androidTest/java/androidx/transition/TrackingVisibility.java
index 91917c5..46c421e 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/TrackingVisibility.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/TrackingVisibility.java
@@ -15,14 +15,13 @@
*/
package androidx.transition;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
-import androidx.annotation.NonNull;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorListenerAdapter;
-import androidx.core.animation.ObjectAnimator;
import androidx.fragment.app.TargetTracking;
import java.util.ArrayList;
@@ -73,7 +72,7 @@
// and wait for that to end.
animator.addListener(new AnimatorListenerAdapter() {
@Override
- public void onAnimationStart(@NonNull Animator animation) {
+ public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);
animation.removeListener(this);
animation.addListener(this);
@@ -81,7 +80,7 @@
}
@Override
- public void onAnimationEnd(@NonNull Animator animation) {
+ public void onAnimationEnd(Animator animation) {
endAnimatorCountDownLatch.countDown();
animation.removeListener(this);
}
@@ -91,7 +90,6 @@
return null;
}
- @NonNull
@Override
public ArrayList<View> getTrackedTargets() {
return targets;
diff --git a/transition/transition/src/androidTest/java/androidx/transition/TransitionSetTest.java b/transition/transition/src/androidTest/java/androidx/transition/TransitionSetTest.java
index f146126..dfcb088 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/TransitionSetTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/TransitionSetTest.java
@@ -25,15 +25,14 @@
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
+import android.animation.TimeInterpolator;
import android.graphics.Rect;
import android.view.View;
import android.view.ViewGroup;
+import android.view.animation.AccelerateDecelerateInterpolator;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.DecelerateInterpolator;
-import androidx.annotation.NonNull;
-import androidx.core.animation.AccelerateDecelerateInterpolator;
-import androidx.core.animation.AccelerateInterpolator;
-import androidx.core.animation.DecelerateInterpolator;
-import androidx.core.animation.Interpolator;
import androidx.test.filters.SmallTest;
import androidx.transition.test.R;
@@ -146,7 +145,7 @@
fade.setPropagation(new TestPropagation());
fade.setEpicenterCallback(new Transition.EpicenterCallback() {
@Override
- public Rect onGetEpicenter(@NonNull Transition transition) {
+ public Rect onGetEpicenter(Transition transition) {
return null;
}
});
@@ -156,11 +155,11 @@
TransitionSet transitionSet = new TransitionSet();
int duration = 100;
TestPropagation propagation = new TestPropagation();
- Interpolator interpolator = new DecelerateInterpolator();
+ TimeInterpolator interpolator = new DecelerateInterpolator();
PathMotion pathMotion = new ArcMotion();
Transition.EpicenterCallback epicenterCallback = new Transition.EpicenterCallback() {
@Override
- public Rect onGetEpicenter(@NonNull Transition transition) {
+ public Rect onGetEpicenter(Transition transition) {
return null;
}
};
@@ -185,7 +184,7 @@
fade.setPropagation(new TestPropagation());
fade.setEpicenterCallback(new Transition.EpicenterCallback() {
@Override
- public Rect onGetEpicenter(@NonNull Transition transition) {
+ public Rect onGetEpicenter(Transition transition) {
return null;
}
});
@@ -212,11 +211,11 @@
Fade fade = new Fade();
int duration = 100;
TestPropagation propagation = new TestPropagation();
- Interpolator interpolator = new DecelerateInterpolator();
+ TimeInterpolator interpolator = new DecelerateInterpolator();
PathMotion pathMotion = new ArcMotion();
Transition.EpicenterCallback epicenterCallback = new Transition.EpicenterCallback() {
@Override
- public Rect onGetEpicenter(@NonNull Transition transition) {
+ public Rect onGetEpicenter(Transition transition) {
return null;
}
};
@@ -246,7 +245,7 @@
transitionSet.addTransition(fade); // here set's duration and interpolator are applied
int overriddenDuration = 200;
- Interpolator overriddenInterpolator = new AccelerateInterpolator();
+ TimeInterpolator overriddenInterpolator = new AccelerateInterpolator();
fade.setDuration(overriddenDuration);
fade.setInterpolator(overriddenInterpolator);
diff --git a/transition/transition/src/androidTest/java/androidx/transition/TransitionTest.java b/transition/transition/src/androidTest/java/androidx/transition/TransitionTest.java
index 5c654b5..2a52da8 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/TransitionTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/TransitionTest.java
@@ -32,20 +32,20 @@
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.TimeInterpolator;
import android.graphics.Rect;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
+import android.view.animation.LinearInterpolator;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.Interpolator;
-import androidx.core.animation.LinearInterpolator;
-import androidx.core.animation.ObjectAnimator;
import androidx.core.view.ViewCompat;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.MediumTest;
@@ -88,7 +88,7 @@
@Test
public void testInterpolator() {
Transition transition = new EmptyTransition();
- Interpolator interpolator = new LinearInterpolator();
+ TimeInterpolator interpolator = new LinearInterpolator();
assertThat(transition.setInterpolator(interpolator), is(sameInstance(transition)));
assertThat(transition.getInterpolator(), is(interpolator));
}
@@ -226,7 +226,7 @@
public void testExcludeTargetType() throws Throwable {
showInitialScene();
Transition transition = new EmptyTransition();
- FrameLayout container = rule.getActivity().findViewById(R.id.container);
+ FrameLayout container = (FrameLayout) rule.getActivity().findViewById(R.id.container);
View view0 = rule.getActivity().findViewById(R.id.view0);
transition.addTarget(View.class);
assertThat(transition.isValidTarget(container), is(true));
diff --git a/transition/transition/src/androidTest/java/androidx/transition/TranslationAnimationCreatorTest.java b/transition/transition/src/androidTest/java/androidx/transition/TranslationAnimationCreatorTest.java
index 12173c1..976277a 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/TranslationAnimationCreatorTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/TranslationAnimationCreatorTest.java
@@ -20,10 +20,10 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import android.animation.Animator;
import android.view.View;
+import android.view.animation.LinearInterpolator;
-import androidx.core.animation.Animator;
-import androidx.core.animation.LinearInterpolator;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.LargeTest;
diff --git a/transition/transition/src/androidTest/java/androidx/transition/VisibilityTest.java b/transition/transition/src/androidTest/java/androidx/transition/VisibilityTest.java
index 704b0b3..dd8cb01 100644
--- a/transition/transition/src/androidTest/java/androidx/transition/VisibilityTest.java
+++ b/transition/transition/src/androidTest/java/androidx/transition/VisibilityTest.java
@@ -27,14 +27,14 @@
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.ObjectAnimator;
-import androidx.core.animation.ValueAnimator;
import androidx.test.annotation.UiThreadTest;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.MediumTest;
diff --git a/transition/transition/src/main/java/androidx/transition/AnimatorUtils.java b/transition/transition/src/main/java/androidx/transition/AnimatorUtils.java
new file mode 100644
index 0000000..6772a60
--- /dev/null
+++ b/transition/transition/src/main/java/androidx/transition/AnimatorUtils.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 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 androidx.transition;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+
+import java.util.ArrayList;
+
+class AnimatorUtils {
+
+ static void addPauseListener(@NonNull Animator animator,
+ @NonNull AnimatorListenerAdapter listener) {
+ if (Build.VERSION.SDK_INT >= 19) {
+ animator.addPauseListener(listener);
+ }
+ }
+
+ static void pause(@NonNull Animator animator) {
+ if (Build.VERSION.SDK_INT >= 19) {
+ animator.pause();
+ } else {
+ final ArrayList<Animator.AnimatorListener> listeners = animator.getListeners();
+ if (listeners != null) {
+ for (int i = 0, size = listeners.size(); i < size; i++) {
+ final Animator.AnimatorListener listener = listeners.get(i);
+ if (listener instanceof AnimatorPauseListenerCompat) {
+ ((AnimatorPauseListenerCompat) listener).onAnimationPause(animator);
+ }
+ }
+ }
+ }
+ }
+
+ static void resume(@NonNull Animator animator) {
+ if (Build.VERSION.SDK_INT >= 19) {
+ animator.resume();
+ } else {
+ final ArrayList<Animator.AnimatorListener> listeners = animator.getListeners();
+ if (listeners != null) {
+ for (int i = 0, size = listeners.size(); i < size; i++) {
+ final Animator.AnimatorListener listener = listeners.get(i);
+ if (listener instanceof AnimatorPauseListenerCompat) {
+ ((AnimatorPauseListenerCompat) listener).onAnimationResume(animator);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Listeners can implement this interface in addition to the platform AnimatorPauseListener to
+ * make them compatible with API level 18 and below. Animators will not be paused or resumed,
+ * but the callbacks here are invoked.
+ */
+ interface AnimatorPauseListenerCompat {
+
+ void onAnimationPause(Animator animation);
+
+ void onAnimationResume(Animator animation);
+
+ }
+
+ private AnimatorUtils() {
+ }
+}
diff --git a/transition/transition/src/main/java/androidx/transition/ChangeBounds.java b/transition/transition/src/main/java/androidx/transition/ChangeBounds.java
index a652cb5..a0fcc2c 100644
--- a/transition/transition/src/main/java/androidx/transition/ChangeBounds.java
+++ b/transition/transition/src/main/java/androidx/transition/ChangeBounds.java
@@ -16,6 +16,11 @@
package androidx.transition;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
@@ -34,12 +39,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorListenerAdapter;
-import androidx.core.animation.AnimatorSet;
-import androidx.core.animation.ObjectAnimator;
-import androidx.core.animation.PropertyValuesHolder;
-import androidx.core.animation.RectEvaluator;
import androidx.core.content.res.TypedArrayUtils;
import androidx.core.view.ViewCompat;
@@ -308,19 +307,19 @@
if (startWidth == endWidth && startHeight == endHeight) {
Path topLeftPath = getPathMotion().getPath(startLeft, startTop, endLeft,
endTop);
- anim = ObjectAnimator.ofObject(view, POSITION_PROPERTY, null,
+ anim = ObjectAnimatorUtils.ofPointF(view, POSITION_PROPERTY,
topLeftPath);
} else {
final ViewBounds viewBounds = new ViewBounds(view);
Path topLeftPath = getPathMotion().getPath(startLeft, startTop,
endLeft, endTop);
- ObjectAnimator topLeftAnimator = ObjectAnimator
- .ofObject(viewBounds, TOP_LEFT_PROPERTY, null, topLeftPath);
+ ObjectAnimator topLeftAnimator = ObjectAnimatorUtils
+ .ofPointF(viewBounds, TOP_LEFT_PROPERTY, topLeftPath);
Path bottomRightPath = getPathMotion().getPath(startRight, startBottom,
endRight, endBottom);
- ObjectAnimator bottomRightAnimator = ObjectAnimator.ofObject(
- viewBounds, BOTTOM_RIGHT_PROPERTY, null, bottomRightPath);
+ ObjectAnimator bottomRightAnimator = ObjectAnimatorUtils.ofPointF(
+ viewBounds, BOTTOM_RIGHT_PROPERTY, bottomRightPath);
AnimatorSet set = new AnimatorSet();
set.playTogether(topLeftAnimator, bottomRightAnimator);
anim = set;
@@ -334,12 +333,12 @@
} else if (startLeft != endLeft || startTop != endTop) {
Path topLeftPath = getPathMotion().getPath(startLeft, startTop,
endLeft, endTop);
- anim = ObjectAnimator.ofObject(view, TOP_LEFT_ONLY_PROPERTY, null,
+ anim = ObjectAnimatorUtils.ofPointF(view, TOP_LEFT_ONLY_PROPERTY,
topLeftPath);
} else {
Path bottomRight = getPathMotion().getPath(startRight, startBottom,
endRight, endBottom);
- anim = ObjectAnimator.ofObject(view, BOTTOM_RIGHT_ONLY_PROPERTY, null,
+ anim = ObjectAnimatorUtils.ofPointF(view, BOTTOM_RIGHT_ONLY_PROPERTY,
bottomRight);
}
} else {
@@ -353,7 +352,7 @@
if (startLeft != endLeft || startTop != endTop) {
Path topLeftPath = getPathMotion().getPath(startLeft, startTop, endLeft,
endTop);
- positionAnimator = ObjectAnimator.ofObject(view, POSITION_PROPERTY, null,
+ positionAnimator = ObjectAnimatorUtils.ofPointF(view, POSITION_PROPERTY,
topLeftPath);
}
final Rect finalClip = endClip;
@@ -372,12 +371,12 @@
private boolean mIsCanceled;
@Override
- public void onAnimationCancel(@NonNull Animator animation) {
+ public void onAnimationCancel(Animator animation) {
mIsCanceled = true;
}
@Override
- public void onAnimationEnd(@NonNull Animator animation) {
+ public void onAnimationEnd(Animator animation) {
if (!mIsCanceled) {
ViewCompat.setClipBounds(view, finalClip);
ViewUtils.setLeftTopRightBottom(view, endLeft, endTop, endRight,
@@ -443,12 +442,12 @@
Path topLeftPath = getPathMotion().getPath(startX - mTempLocation[0],
startY - mTempLocation[1], endX - mTempLocation[0],
endY - mTempLocation[1]);
- PropertyValuesHolder origin = PropertyValuesHolder.ofObject(
- DRAWABLE_ORIGIN_PROPERTY, null, topLeftPath);
+ PropertyValuesHolder origin = PropertyValuesHolderUtils.ofPointF(
+ DRAWABLE_ORIGIN_PROPERTY, topLeftPath);
ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(drawable, origin);
anim.addListener(new AnimatorListenerAdapter() {
@Override
- public void onAnimationEnd(@NonNull Animator animation) {
+ public void onAnimationEnd(Animator animation) {
ViewUtils.getOverlay(sceneRoot).remove(drawable);
ViewUtils.setTransitionAlpha(view, transitionAlpha);
}
diff --git a/transition/transition/src/main/java/androidx/transition/ChangeClipBounds.java b/transition/transition/src/main/java/androidx/transition/ChangeClipBounds.java
index 85c039d..b568ae2 100644
--- a/transition/transition/src/main/java/androidx/transition/ChangeClipBounds.java
+++ b/transition/transition/src/main/java/androidx/transition/ChangeClipBounds.java
@@ -16,6 +16,9 @@
package androidx.transition;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
@@ -24,10 +27,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorListenerAdapter;
-import androidx.core.animation.ObjectAnimator;
-import androidx.core.animation.RectEvaluator;
import androidx.core.view.ViewCompat;
/**
@@ -116,7 +115,7 @@
final View endView = endValues.view;
animator.addListener(new AnimatorListenerAdapter() {
@Override
- public void onAnimationEnd(@NonNull Animator animation) {
+ public void onAnimationEnd(Animator animation) {
ViewCompat.setClipBounds(endView, null);
}
});
diff --git a/transition/transition/src/main/java/androidx/transition/ChangeImageTransform.java b/transition/transition/src/main/java/androidx/transition/ChangeImageTransform.java
index 1b53282..cfdbbd3 100644
--- a/transition/transition/src/main/java/androidx/transition/ChangeImageTransform.java
+++ b/transition/transition/src/main/java/androidx/transition/ChangeImageTransform.java
@@ -16,6 +16,9 @@
package androidx.transition;
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
+import android.animation.TypeEvaluator;
import android.content.Context;
import android.graphics.Matrix;
import android.graphics.Rect;
@@ -28,9 +31,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.ObjectAnimator;
-import androidx.core.animation.TypeEvaluator;
import java.util.Map;
@@ -54,8 +54,7 @@
private static final TypeEvaluator<Matrix> NULL_MATRIX_EVALUATOR = new TypeEvaluator<Matrix>() {
@Override
- public Matrix evaluate(float fraction, @NonNull Matrix startValue,
- @NonNull Matrix endValue) {
+ public Matrix evaluate(float fraction, Matrix startValue, Matrix endValue) {
return null;
}
};
diff --git a/transition/transition/src/main/java/androidx/transition/ChangeScroll.java b/transition/transition/src/main/java/androidx/transition/ChangeScroll.java
index 56421e3..d2b9a21 100644
--- a/transition/transition/src/main/java/androidx/transition/ChangeScroll.java
+++ b/transition/transition/src/main/java/androidx/transition/ChangeScroll.java
@@ -16,6 +16,8 @@
package androidx.transition;
+import android.animation.Animator;
+import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
@@ -23,8 +25,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.ObjectAnimator;
/**
diff --git a/transition/transition/src/main/java/androidx/transition/ChangeTransform.java b/transition/transition/src/main/java/androidx/transition/ChangeTransform.java
index 69f36f5..84b869f 100644
--- a/transition/transition/src/main/java/androidx/transition/ChangeTransform.java
+++ b/transition/transition/src/main/java/androidx/transition/ChangeTransform.java
@@ -16,6 +16,10 @@
package androidx.transition;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
@@ -30,11 +34,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorListenerAdapter;
-import androidx.core.animation.FloatArrayEvaluator;
-import androidx.core.animation.ObjectAnimator;
-import androidx.core.animation.PropertyValuesHolder;
import androidx.core.content.res.TypedArrayUtils;
import androidx.core.view.ViewCompat;
@@ -322,8 +321,8 @@
Path path = getPathMotion().getPath(startMatrixValues[Matrix.MTRANS_X],
startMatrixValues[Matrix.MTRANS_Y], endMatrixValues[Matrix.MTRANS_X],
endMatrixValues[Matrix.MTRANS_Y]);
- PropertyValuesHolder translationProperty = PropertyValuesHolder.ofObject(
- TRANSLATIONS_PROPERTY, null, path);
+ PropertyValuesHolder translationProperty = PropertyValuesHolderUtils.ofPointF(
+ TRANSLATIONS_PROPERTY, path);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(pathAnimatorMatrix,
valuesProperty, translationProperty);
@@ -334,12 +333,12 @@
private Matrix mTempMatrix = new Matrix();
@Override
- public void onAnimationCancel(@NonNull Animator animation) {
+ public void onAnimationCancel(Animator animation) {
mIsCanceled = true;
}
@Override
- public void onAnimationEnd(@NonNull Animator animation) {
+ public void onAnimationEnd(Animator animation) {
if (!mIsCanceled) {
if (handleParentChange && mUseOverlay) {
setCurrentMatrix(finalEndMatrix);
@@ -353,13 +352,13 @@
}
@Override
- public void onAnimationPause(@NonNull Animator animation) {
+ public void onAnimationPause(Animator animation) {
Matrix currentMatrix = pathAnimatorMatrix.getMatrix();
setCurrentMatrix(currentMatrix);
}
@Override
- public void onAnimationResume(@NonNull Animator animation) {
+ public void onAnimationResume(Animator animation) {
setIdentityTransforms(view);
}
@@ -371,7 +370,7 @@
};
animator.addListener(listener);
- animator.addPauseListener(listener);
+ AnimatorUtils.addPauseListener(animator, listener);
return animator;
}
diff --git a/transition/transition/src/main/java/androidx/transition/Explode.java b/transition/transition/src/main/java/androidx/transition/Explode.java
index a142b40..2423e3e 100644
--- a/transition/transition/src/main/java/androidx/transition/Explode.java
+++ b/transition/transition/src/main/java/androidx/transition/Explode.java
@@ -16,18 +16,18 @@
package androidx.transition;
+import android.animation.Animator;
+import android.animation.TimeInterpolator;
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.DecelerateInterpolator;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.AccelerateInterpolator;
-import androidx.core.animation.Animator;
-import androidx.core.animation.DecelerateInterpolator;
-import androidx.core.animation.Interpolator;
/**
* This transition tracks changes to the visibility of target views in the
@@ -42,8 +42,8 @@
*/
public class Explode extends Visibility {
- private static final Interpolator sDecelerate = new DecelerateInterpolator();
- private static final Interpolator sAccelerate = new AccelerateInterpolator();
+ private static final TimeInterpolator sDecelerate = new DecelerateInterpolator();
+ private static final TimeInterpolator sAccelerate = new AccelerateInterpolator();
private static final String PROPNAME_SCREEN_BOUNDS = "android:explode:screenBounds";
private int[] mTempLoc = new int[2];
diff --git a/transition/transition/src/main/java/androidx/transition/Fade.java b/transition/transition/src/main/java/androidx/transition/Fade.java
index 39071f1..50c8390 100644
--- a/transition/transition/src/main/java/androidx/transition/Fade.java
+++ b/transition/transition/src/main/java/androidx/transition/Fade.java
@@ -16,6 +16,9 @@
package androidx.transition;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
@@ -27,9 +30,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorListenerAdapter;
-import androidx.core.animation.ObjectAnimator;
import androidx.core.content.res.TypedArrayUtils;
import androidx.core.view.ViewCompat;
@@ -191,7 +191,7 @@
}
@Override
- public void onAnimationStart(@NonNull Animator animation) {
+ public void onAnimationStart(Animator animation) {
if (ViewCompat.hasOverlappingRendering(mView)
&& mView.getLayerType() == View.LAYER_TYPE_NONE) {
mLayerTypeChanged = true;
@@ -200,7 +200,7 @@
}
@Override
- public void onAnimationEnd(@NonNull Animator animation) {
+ public void onAnimationEnd(Animator animation) {
ViewUtils.setTransitionAlpha(mView, 1);
if (mLayerTypeChanged) {
mView.setLayerType(View.LAYER_TYPE_NONE, null);
diff --git a/transition/transition/src/main/java/androidx/transition/FloatArrayEvaluator.java b/transition/transition/src/main/java/androidx/transition/FloatArrayEvaluator.java
new file mode 100644
index 0000000..9947921
--- /dev/null
+++ b/transition/transition/src/main/java/androidx/transition/FloatArrayEvaluator.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 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 androidx.transition;
+
+import android.animation.TypeEvaluator;
+
+/**
+ * This evaluator can be used to perform type interpolation between <code>float[]</code> values.
+ * Each index into the array is treated as a separate value to interpolate. For example,
+ * evaluating <code>{100, 200}</code> and <code>{300, 400}</code> will interpolate the value at
+ * the first index between 100 and 300 and the value at the second index value between 200 and 400.
+ */
+class FloatArrayEvaluator implements TypeEvaluator<float[]> {
+
+ private float[] mArray;
+
+ /**
+ * Create a FloatArrayEvaluator that reuses <code>reuseArray</code> for every evaluate() call.
+ * Caution must be taken to ensure that the value returned from
+ * {@link android.animation.ValueAnimator#getAnimatedValue()} is not cached, modified, or
+ * used across threads. The value will be modified on each <code>evaluate()</code> call.
+ *
+ * @param reuseArray The array to modify and return from <code>evaluate</code>.
+ */
+ FloatArrayEvaluator(float[] reuseArray) {
+ mArray = reuseArray;
+ }
+
+ /**
+ * Interpolates the value at each index by the fraction. If
+ * {@link #FloatArrayEvaluator(float[])} was used to construct this object,
+ * <code>reuseArray</code> will be returned, otherwise a new <code>float[]</code>
+ * will be returned.
+ *
+ * @param fraction The fraction from the starting to the ending values
+ * @param startValue The start value.
+ * @param endValue The end value.
+ * @return A <code>float[]</code> where each element is an interpolation between
+ * the same index in startValue and endValue.
+ */
+ @Override
+ public float[] evaluate(float fraction, float[] startValue, float[] endValue) {
+ float[] array = mArray;
+ if (array == null) {
+ array = new float[startValue.length];
+ }
+
+ for (int i = 0; i < array.length; i++) {
+ float start = startValue[i];
+ float end = endValue[i];
+ array[i] = start + (fraction * (end - start));
+ }
+ return array;
+ }
+
+}
diff --git a/transition/transition/src/main/java/androidx/transition/ObjectAnimatorUtils.java b/transition/transition/src/main/java/androidx/transition/ObjectAnimatorUtils.java
new file mode 100644
index 0000000..bd73b58
--- /dev/null
+++ b/transition/transition/src/main/java/androidx/transition/ObjectAnimatorUtils.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 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 androidx.transition;
+
+import android.animation.ObjectAnimator;
+import android.graphics.Path;
+import android.graphics.PointF;
+import android.os.Build;
+import android.util.Property;
+
+class ObjectAnimatorUtils {
+
+ static <T> ObjectAnimator ofPointF(T target, Property<T, PointF> property, Path path) {
+ if (Build.VERSION.SDK_INT >= 21) {
+ return ObjectAnimator.ofObject(target, property, null, path);
+ }
+ return ObjectAnimator.ofFloat(target, new PathProperty<>(property, path), 0f, 1f);
+ }
+
+ private ObjectAnimatorUtils() {
+ }
+}
diff --git a/transition/transition/src/main/java/androidx/transition/PathProperty.java b/transition/transition/src/main/java/androidx/transition/PathProperty.java
new file mode 100644
index 0000000..be2dddb
--- /dev/null
+++ b/transition/transition/src/main/java/androidx/transition/PathProperty.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 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 androidx.transition;
+
+import android.graphics.Path;
+import android.graphics.PathMeasure;
+import android.graphics.PointF;
+import android.util.Property;
+
+/**
+ * A special {@link Property} that can animate a pair of properties bi-dimensionally along the
+ * specified path.
+ * <p>
+ * This property should always be used with Animator that sets float fractions between
+ * {@code 0.f} and {@code 1.f}. For example, setting {@code 0.5f} to this property sets the
+ * values right in the middle of the specified path to the underlying properties.
+ * <p>
+ * Unlike many of the platform built-in properties, instances of this class cannot be reused
+ * for later animations.
+ */
+class PathProperty<T> extends Property<T, Float> {
+
+ private final Property<T, PointF> mProperty;
+ private final PathMeasure mPathMeasure;
+ private final float mPathLength;
+ private final float[] mPosition = new float[2];
+ private final PointF mPointF = new PointF();
+ private float mCurrentFraction;
+
+ PathProperty(Property<T, PointF> property, Path path) {
+ super(Float.class, property.getName());
+ mProperty = property;
+ mPathMeasure = new PathMeasure(path, false);
+ mPathLength = mPathMeasure.getLength();
+ }
+
+ @Override
+ public Float get(T object) {
+ return mCurrentFraction;
+ }
+
+ @Override
+ public void set(T target, Float fraction) {
+ mCurrentFraction = fraction;
+ mPathMeasure.getPosTan(mPathLength * fraction, mPosition, null);
+ mPointF.x = mPosition[0];
+ mPointF.y = mPosition[1];
+ mProperty.set(target, mPointF);
+ }
+
+}
diff --git a/transition/transition/src/main/java/androidx/transition/PropertyValuesHolderUtils.java b/transition/transition/src/main/java/androidx/transition/PropertyValuesHolderUtils.java
new file mode 100644
index 0000000..42527c4
--- /dev/null
+++ b/transition/transition/src/main/java/androidx/transition/PropertyValuesHolderUtils.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 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 androidx.transition;
+
+import android.animation.PropertyValuesHolder;
+import android.graphics.Path;
+import android.graphics.PointF;
+import android.os.Build;
+import android.util.Property;
+
+class PropertyValuesHolderUtils {
+
+ /**
+ * Constructs and returns a PropertyValuesHolder with a given property and
+ * a Path along which the values should be animated. This variant supports a
+ * <code>TypeConverter</code> to convert from <code>PointF</code> to the target
+ * type.
+ *
+ * @param property The property being animated. Should not be null.
+ * @param path The Path along which the values should be animated.
+ * @return PropertyValuesHolder The constructed PropertyValuesHolder object.
+ */
+ static PropertyValuesHolder ofPointF(Property<?, PointF> property, Path path) {
+ if (Build.VERSION.SDK_INT >= 21) {
+ return PropertyValuesHolder.ofObject(property, null, path);
+ }
+ return PropertyValuesHolder.ofFloat(new PathProperty<>(property, path), 0f, 1f);
+ }
+
+ private PropertyValuesHolderUtils() {
+ }
+}
diff --git a/transition/transition/src/main/java/androidx/transition/RectEvaluator.java b/transition/transition/src/main/java/androidx/transition/RectEvaluator.java
new file mode 100644
index 0000000..6dab422
--- /dev/null
+++ b/transition/transition/src/main/java/androidx/transition/RectEvaluator.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2016 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.transition;
+
+import android.animation.TypeEvaluator;
+import android.graphics.Rect;
+
+/**
+ * This evaluator can be used to perform type interpolation between <code>Rect</code> values.
+ */
+class RectEvaluator implements TypeEvaluator<Rect> {
+
+ /**
+ * When null, a new Rect is returned on every evaluate call. When non-null,
+ * mRect will be modified and returned on every evaluate.
+ */
+ private Rect mRect;
+
+ /**
+ * Construct a RectEvaluator that returns a new Rect on every evaluate call.
+ * To avoid creating an object for each evaluate call,
+ * {@link RectEvaluator#RectEvaluator(android.graphics.Rect)} should be used
+ * whenever possible.
+ */
+ RectEvaluator() {
+ }
+
+ /**
+ * Constructs a RectEvaluator that modifies and returns <code>reuseRect</code>
+ * in {@link #evaluate(float, android.graphics.Rect, android.graphics.Rect)} calls.
+ * The value returned from
+ * {@link #evaluate(float, android.graphics.Rect, android.graphics.Rect)} should
+ * not be cached because it will change over time as the object is reused on each
+ * call.
+ *
+ * @param reuseRect A Rect to be modified and returned by evaluate.
+ */
+ RectEvaluator(Rect reuseRect) {
+ mRect = reuseRect;
+ }
+
+ /**
+ * This function returns the result of linearly interpolating the start and
+ * end Rect values, with <code>fraction</code> representing the proportion
+ * between the start and end values. The calculation is a simple parametric
+ * calculation on each of the separate components in the Rect objects
+ * (left, top, right, and bottom).
+ *
+ * <p>If {@link #RectEvaluator(android.graphics.Rect)} was used to construct
+ * this RectEvaluator, the object returned will be the <code>reuseRect</code>
+ * passed into the constructor.</p>
+ *
+ * @param fraction The fraction from the starting to the ending values
+ * @param startValue The start Rect
+ * @param endValue The end Rect
+ * @return A linear interpolation between the start and end values, given the
+ * <code>fraction</code> parameter.
+ */
+ @Override
+ public Rect evaluate(float fraction, Rect startValue, Rect endValue) {
+ int left = startValue.left + (int) ((endValue.left - startValue.left) * fraction);
+ int top = startValue.top + (int) ((endValue.top - startValue.top) * fraction);
+ int right = startValue.right + (int) ((endValue.right - startValue.right) * fraction);
+ int bottom = startValue.bottom + (int) ((endValue.bottom - startValue.bottom) * fraction);
+ if (mRect == null) {
+ return new Rect(left, top, right, bottom);
+ } else {
+ mRect.set(left, top, right, bottom);
+ return mRect;
+ }
+ }
+}
diff --git a/transition/transition/src/main/java/androidx/transition/Slide.java b/transition/transition/src/main/java/androidx/transition/Slide.java
index fc06702..ac438c3 100644
--- a/transition/transition/src/main/java/androidx/transition/Slide.java
+++ b/transition/transition/src/main/java/androidx/transition/Slide.java
@@ -18,6 +18,8 @@
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
+import android.animation.Animator;
+import android.animation.TimeInterpolator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
@@ -25,15 +27,13 @@
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
+import android.view.animation.AccelerateInterpolator;
+import android.view.animation.DecelerateInterpolator;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
-import androidx.core.animation.AccelerateInterpolator;
-import androidx.core.animation.Animator;
-import androidx.core.animation.DecelerateInterpolator;
-import androidx.core.animation.Interpolator;
import androidx.core.content.res.TypedArrayUtils;
import androidx.core.view.ViewCompat;
@@ -53,8 +53,8 @@
*/
public class Slide extends Visibility {
- private static final Interpolator sDecelerate = new DecelerateInterpolator();
- private static final Interpolator sAccelerate = new AccelerateInterpolator();
+ private static final TimeInterpolator sDecelerate = new DecelerateInterpolator();
+ private static final TimeInterpolator sAccelerate = new AccelerateInterpolator();
private static final String PROPNAME_SCREEN_POSITION = "android:slide:screenPosition";
private CalculateSlide mSlideCalculator = sCalculateBottom;
private int mSlideEdge = Gravity.BOTTOM;
diff --git a/transition/transition/src/main/java/androidx/transition/Transition.java b/transition/transition/src/main/java/androidx/transition/Transition.java
index b0444f5..4458a46 100644
--- a/transition/transition/src/main/java/androidx/transition/Transition.java
+++ b/transition/transition/src/main/java/androidx/transition/Transition.java
@@ -18,6 +18,9 @@
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.TimeInterpolator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
@@ -33,6 +36,7 @@
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
+import android.view.animation.AnimationUtils;
import android.widget.ListView;
import android.widget.Spinner;
@@ -43,10 +47,6 @@
import androidx.annotation.RestrictTo;
import androidx.collection.ArrayMap;
import androidx.collection.LongSparseArray;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorInflater;
-import androidx.core.animation.AnimatorListenerAdapter;
-import androidx.core.animation.Interpolator;
import androidx.core.content.res.TypedArrayUtils;
import androidx.core.view.ViewCompat;
@@ -182,7 +182,7 @@
private long mStartDelay = -1;
long mDuration = -1;
- private Interpolator mInterpolator = null;
+ private TimeInterpolator mInterpolator = null;
ArrayList<Integer> mTargetIds = new ArrayList<>();
ArrayList<View> mTargets = new ArrayList<>();
private ArrayList<String> mTargetNames = null;
@@ -287,7 +287,7 @@
final int resId = TypedArrayUtils.getNamedResourceId(a, parser, "interpolator",
Styleable.Transition.INTERPOLATOR, 0);
if (resId > 0) {
- setInterpolator(AnimatorInflater.loadInterpolator(context, resId));
+ setInterpolator(AnimationUtils.loadInterpolator(context, resId));
}
String matchOrder = TypedArrayUtils.getNamedString(a, parser, "matchOrder",
Styleable.Transition.MATCH_ORDER);
@@ -391,7 +391,7 @@
* @return This transition object.
*/
@NonNull
- public Transition setInterpolator(@Nullable Interpolator interpolator) {
+ public Transition setInterpolator(@Nullable TimeInterpolator interpolator) {
mInterpolator = interpolator;
return this;
}
@@ -405,7 +405,7 @@
* returns null.
*/
@Nullable
- public Interpolator getInterpolator() {
+ public TimeInterpolator getInterpolator() {
return mInterpolator;
}
@@ -894,12 +894,12 @@
// TODO: could be a single listener instance for all of them since it uses the param
animator.addListener(new AnimatorListenerAdapter() {
@Override
- public void onAnimationStart(@NonNull Animator animation) {
+ public void onAnimationStart(Animator animation) {
mCurrentAnimators.add(animation);
}
@Override
- public void onAnimationEnd(@NonNull Animator animation) {
+ public void onAnimationEnd(Animator animation) {
runningAnimators.remove(animation);
mCurrentAnimators.remove(animation);
}
@@ -1721,7 +1721,7 @@
AnimationInfo info = runningAnimators.valueAt(i);
if (info.mView != null && windowId.equals(info.mWindowId)) {
Animator anim = runningAnimators.keyAt(i);
- anim.pause();
+ AnimatorUtils.pause(anim);
}
}
if (mListeners != null && mListeners.size() > 0) {
@@ -1754,7 +1754,7 @@
AnimationInfo info = runningAnimators.valueAt(i);
if (info.mView != null && windowId.equals(info.mWindowId)) {
Animator anim = runningAnimators.keyAt(i);
- anim.resume();
+ AnimatorUtils.resume(anim);
}
}
if (mListeners != null && mListeners.size() > 0) {
@@ -1907,7 +1907,7 @@
}
animator.addListener(new AnimatorListenerAdapter() {
@Override
- public void onAnimationEnd(@NonNull Animator animation) {
+ public void onAnimationEnd(Animator animation) {
end();
animation.removeListener(this);
}
@@ -2205,13 +2205,11 @@
mCanRemoveViews = canRemoveViews;
}
- @NonNull
@Override
public String toString() {
return toString("");
}
- @NonNull
@Override
public Transition clone() {
try {
@@ -2223,7 +2221,7 @@
clone.mEndValuesList = null;
return clone;
} catch (CloneNotSupportedException e) {
- throw new RuntimeException(e);
+ return null;
}
}
diff --git a/transition/transition/src/main/java/androidx/transition/TransitionSet.java b/transition/transition/src/main/java/androidx/transition/TransitionSet.java
index 0371233..0c71667 100644
--- a/transition/transition/src/main/java/androidx/transition/TransitionSet.java
+++ b/transition/transition/src/main/java/androidx/transition/TransitionSet.java
@@ -18,6 +18,7 @@
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
+import android.animation.TimeInterpolator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
@@ -31,7 +32,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
-import androidx.core.animation.Interpolator;
import androidx.core.content.res.TypedArrayUtils;
import java.util.ArrayList;
@@ -254,7 +254,7 @@
@NonNull
@Override
- public TransitionSet setInterpolator(@Nullable Interpolator interpolator) {
+ public TransitionSet setInterpolator(@Nullable TimeInterpolator interpolator) {
mChangeFlags |= FLAG_CHANGE_INTERPOLATOR;
if (mTransitions != null) {
int numTransitions = mTransitions.size();
@@ -634,7 +634,6 @@
return result;
}
- @NonNull
@Override
public Transition clone() {
TransitionSet clone = (TransitionSet) super.clone();
diff --git a/transition/transition/src/main/java/androidx/transition/TransitionUtils.java b/transition/transition/src/main/java/androidx/transition/TransitionUtils.java
index ae17040..5360727 100644
--- a/transition/transition/src/main/java/androidx/transition/TransitionUtils.java
+++ b/transition/transition/src/main/java/androidx/transition/TransitionUtils.java
@@ -16,6 +16,9 @@
package androidx.transition;
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.TypeEvaluator;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
@@ -26,11 +29,6 @@
import android.view.ViewGroup;
import android.widget.ImageView;
-import androidx.annotation.NonNull;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorSet;
-import androidx.core.animation.TypeEvaluator;
-
class TransitionUtils {
private static final int MAX_IMAGE_SIZE = 1024 * 1024;
@@ -162,10 +160,8 @@
final Matrix mTempMatrix = new Matrix();
- @NonNull
@Override
- public Matrix evaluate(float fraction, @NonNull Matrix startValue,
- @NonNull Matrix endValue) {
+ public Matrix evaluate(float fraction, Matrix startValue, Matrix endValue) {
startValue.getValues(mTempStartValues);
endValue.getValues(mTempEndValues);
for (int i = 0; i < 9; i++) {
diff --git a/transition/transition/src/main/java/androidx/transition/TranslationAnimationCreator.java b/transition/transition/src/main/java/androidx/transition/TranslationAnimationCreator.java
index 7104c4a..7a24a33 100644
--- a/transition/transition/src/main/java/androidx/transition/TranslationAnimationCreator.java
+++ b/transition/transition/src/main/java/androidx/transition/TranslationAnimationCreator.java
@@ -16,15 +16,15 @@
package androidx.transition;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
+import android.animation.TimeInterpolator;
import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorListenerAdapter;
-import androidx.core.animation.Interpolator;
-import androidx.core.animation.ObjectAnimator;
-import androidx.core.animation.PropertyValuesHolder;
/**
* This class is used by Slide and Explode to create an animator that goes from the start
@@ -52,7 +52,7 @@
@Nullable
static Animator createAnimation(@NonNull View view, @NonNull TransitionValues values,
int viewPosX, int viewPosY, float startX, float startY, float endX, float endY,
- @Nullable Interpolator interpolator, @NonNull Transition transition) {
+ @Nullable TimeInterpolator interpolator, @NonNull Transition transition) {
float terminalX = view.getTranslationX();
float terminalY = view.getTranslationY();
int[] startPosition = (int[]) values.view.getTag(R.id.transition_position);
@@ -77,7 +77,7 @@
startPosX, startPosY, terminalX, terminalY);
transition.addListener(listener);
anim.addListener(listener);
- anim.addPauseListener(listener);
+ AnimatorUtils.addPauseListener(anim, listener);
anim.setInterpolator(interpolator);
return anim;
}
@@ -110,7 +110,7 @@
}
@Override
- public void onAnimationCancel(@NonNull Animator animation) {
+ public void onAnimationCancel(Animator animation) {
if (mTransitionPosition == null) {
mTransitionPosition = new int[2];
}
@@ -120,7 +120,7 @@
}
@Override
- public void onAnimationPause(@NonNull Animator animator) {
+ public void onAnimationPause(Animator animator) {
mPausedX = mMovingView.getTranslationX();
mPausedY = mMovingView.getTranslationY();
mMovingView.setTranslationX(mTerminalX);
@@ -128,7 +128,7 @@
}
@Override
- public void onAnimationResume(@NonNull Animator animator) {
+ public void onAnimationResume(Animator animator) {
mMovingView.setTranslationX(mPausedX);
mMovingView.setTranslationY(mPausedY);
}
diff --git a/transition/transition/src/main/java/androidx/transition/Visibility.java b/transition/transition/src/main/java/androidx/transition/Visibility.java
index 3d10a0f..23fbc3b 100644
--- a/transition/transition/src/main/java/androidx/transition/Visibility.java
+++ b/transition/transition/src/main/java/androidx/transition/Visibility.java
@@ -18,6 +18,8 @@
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX;
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
@@ -30,8 +32,6 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
-import androidx.core.animation.Animator;
-import androidx.core.animation.AnimatorListenerAdapter;
import androidx.core.content.res.TypedArrayUtils;
import java.lang.annotation.Retention;
@@ -474,7 +474,7 @@
DisappearListener disappearListener = new DisappearListener(viewToKeep,
endVisibility, true);
animator.addListener(disappearListener);
- animator.addPauseListener(disappearListener);
+ AnimatorUtils.addPauseListener(animator, disappearListener);
addListener(disappearListener);
} else {
ViewUtils.setTransitionVisibility(viewToKeep, originalVisibility);
@@ -525,7 +525,7 @@
}
private static class DisappearListener extends AnimatorListenerAdapter
- implements TransitionListener {
+ implements TransitionListener, AnimatorUtils.AnimatorPauseListenerCompat {
private final View mView;
private final int mFinalVisibility;
@@ -547,7 +547,7 @@
// This overrides both AnimatorListenerAdapter and
// AnimatorUtilsApi14.AnimatorPauseListenerCompat
@Override
- public void onAnimationPause(@NonNull Animator animation) {
+ public void onAnimationPause(Animator animation) {
if (!mCanceled) {
ViewUtils.setTransitionVisibility(mView, mFinalVisibility);
}
@@ -556,27 +556,27 @@
// This overrides both AnimatorListenerAdapter and
// AnimatorUtilsApi14.AnimatorPauseListenerCompat
@Override
- public void onAnimationResume(@NonNull Animator animation) {
+ public void onAnimationResume(Animator animation) {
if (!mCanceled) {
ViewUtils.setTransitionVisibility(mView, View.VISIBLE);
}
}
@Override
- public void onAnimationCancel(@NonNull Animator animation) {
+ public void onAnimationCancel(Animator animation) {
mCanceled = true;
}
@Override
- public void onAnimationRepeat(@NonNull Animator animation) {
+ public void onAnimationRepeat(Animator animation) {
}
@Override
- public void onAnimationStart(@NonNull Animator animation) {
+ public void onAnimationStart(Animator animation) {
}
@Override
- public void onAnimationEnd(@NonNull Animator animation) {
+ public void onAnimationEnd(Animator animation) {
hideViewWhenNotCanceled();
}
diff --git a/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/TableRecompositionTest.kt b/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/TableRecompositionTest.kt
deleted file mode 100644
index 706dc07..0000000
--- a/ui/integration-tests/src/androidTest/java/androidx/ui/integration/test/TableRecompositionTest.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2019 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.ui.integration.test
-
-import androidx.test.filters.MediumTest
-import androidx.ui.core.Modifier
-import androidx.ui.foundation.Box
-import androidx.ui.foundation.drawBackground
-import androidx.ui.graphics.Color
-import androidx.ui.layout.Table
-import androidx.ui.layout.padding
-import androidx.ui.layout.preferredSize
-import androidx.ui.material.MaterialTheme
-import androidx.ui.material.Surface
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.doFramesUntilNoChangesPending
-import androidx.ui.unit.dp
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-
-/**
- * Assert table recompositions.
- */
-@MediumTest
-@RunWith(Parameterized::class)
-class TableRecompositionTest(private val numberOfCells: Int) {
-
- companion object {
- @JvmStatic
- @Parameterized.Parameters
- fun initParameters(): Array<Any> = arrayOf(1, 10)
- }
-
- @get:Rule
- val composeRule = createComposeRule(disableTransitions = true)
-
- @Test
- fun testTable_recomposition() {
- composeRule.forGivenContent {
- MaterialTheme {
- Surface {
- Table(columns = numberOfCells) {
- tableDecoration(overlay = false) { }
- repeat(numberOfCells) {
- tableRow {
- Box(
- Modifier
- .padding(2.dp)
- .preferredSize(100.dp, 50.dp)
- .drawBackground(Color.Black)
- )
- }
- }
- }
- }
- }
- }.performTestWithEventsControl {
- // We expect more than 1 frame because Table decorations are relying on measureWithSize
- // which we don't have on the first frame.
- doFramesUntilNoChangesPending(2)
- }
- }
-}
diff --git a/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/SimpleRadioButton1TestCase.kt b/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/SimpleRadioButton1TestCase.kt
index 474a4a4..7803ca8 100644
--- a/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/SimpleRadioButton1TestCase.kt
+++ b/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/SimpleRadioButton1TestCase.kt
@@ -17,17 +17,18 @@
package androidx.ui.integration.test.core
import androidx.compose.Composable
-import androidx.compose.remember
+import androidx.ui.core.DensityAmbient
import androidx.ui.core.Modifier
import androidx.ui.foundation.Border
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.ContentGravity
import androidx.ui.foundation.shape.corner.CircleShape
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
import androidx.ui.graphics.drawOutline
import androidx.ui.layout.preferredSize
+import androidx.ui.unit.Px
+import androidx.ui.unit.PxSize
import androidx.ui.unit.dp
class SimpleRadioButton1TestCase : BaseSimpleRadioButtonTestCase() {
@@ -39,12 +40,13 @@
border = Border(1.dp, Color.Cyan),
gravity = ContentGravity.Center
) {
- val paint = remember {
- Paint().apply { color = Color.Cyan }
- }
val innerSize = getInnerSize().value
- Canvas(Modifier.preferredSize(innerSize)) {
- drawOutline(CircleShape.createOutline(size, this), paint)
+ val density = DensityAmbient.current
+ Canvas2(Modifier.preferredSize(innerSize)) {
+ drawOutline(
+ CircleShape.createOutline(PxSize(Px(size.width), Px(size.height)), density),
+ Color.Cyan
+ )
}
}
}
diff --git a/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/SimpleRadioButton3TestCase.kt b/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/SimpleRadioButton3TestCase.kt
index 9974a93..65fae25 100644
--- a/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/SimpleRadioButton3TestCase.kt
+++ b/ui/integration-tests/src/main/java/androidx/ui/integration/test/core/SimpleRadioButton3TestCase.kt
@@ -17,28 +17,22 @@
package androidx.ui.integration.test.core
import androidx.compose.Composable
-import androidx.compose.remember
import androidx.ui.core.Modifier
-import androidx.ui.foundation.Canvas
-import androidx.ui.geometry.Offset
-import androidx.ui.graphics.Paint
-import androidx.ui.graphics.PaintingStyle
+import androidx.ui.foundation.Canvas2
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.painter.Stroke
import androidx.ui.layout.preferredSize
import androidx.ui.unit.dp
-import androidx.ui.unit.minDimension
class SimpleRadioButton3TestCase : BaseSimpleRadioButtonTestCase() {
@Composable
override fun emitContent() {
val innerSize = getInnerSize()
- val borderPaint = remember { Paint().apply { style = PaintingStyle.stroke } }
- val fillPaint = remember { Paint() }
- Canvas(Modifier.preferredSize(48.dp)) {
- val center = Offset(size.width.value / 2f, size.height.value / 2f)
- drawCircle(center, size.minDimension.value, borderPaint)
- val innerRadius = innerSize.value.value / 2f
- drawCircle(center, innerRadius, fillPaint)
+ val stroke = Stroke()
+ Canvas2(Modifier.preferredSize(48.dp)) {
+ drawCircle(Color.Black, size.minDimension, style = stroke)
+ drawCircle(Color.Black, innerSize.value.value / 2f, center)
}
}
}
diff --git a/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/ScrollerTestCase.kt b/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/ScrollerTestCase.kt
index d47ac96..6dd8fb5 100644
--- a/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/ScrollerTestCase.kt
+++ b/ui/integration-tests/src/main/java/androidx/ui/integration/test/foundation/ScrollerTestCase.kt
@@ -17,21 +17,17 @@
package androidx.ui.integration.test.foundation
import androidx.compose.Composable
-import androidx.compose.remember
import androidx.ui.core.Modifier
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.ScrollerPosition
import androidx.ui.foundation.VerticalScroller
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
-import androidx.ui.graphics.PaintingStyle
import androidx.ui.integration.test.ToggleableTestCase
import androidx.ui.layout.Column
import androidx.ui.layout.fillMaxHeight
import androidx.ui.layout.preferredSize
import androidx.ui.test.ComposeTestCase
import androidx.ui.unit.dp
-import androidx.ui.unit.toRect
/**
* Test case that puts a large number of boxes in a column in a vertical scroller to force scrolling.
@@ -74,11 +70,8 @@
@Composable
fun ColorStripe(red: Int, green: Int, blue: Int) {
- val paint = remember { Paint() }
- Canvas(Modifier.preferredSize(45.dp, 5.dp)) {
- paint.color = Color(red = red, green = green, blue = blue)
- paint.style = PaintingStyle.fill
- drawRect(size.toRect(), paint)
+ Canvas2(Modifier.preferredSize(45.dp, 5.dp)) {
+ drawRect(Color(red = red, green = green, blue = blue))
}
}
}
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeNothingInAndroidTap.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeNothingInAndroidTap.kt
deleted file mode 100644
index 932b630..0000000
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeNothingInAndroidTap.kt
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.ui.androidview.demos
-
-import android.os.Bundle
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.activity.ComponentActivity
-import androidx.compose.Composition
-import androidx.compose.Recomposer
-import androidx.ui.androidview.adapters.setOnClick
-import androidx.ui.core.Modifier
-import androidx.ui.core.setContent
-import androidx.ui.foundation.Box
-import androidx.ui.foundation.drawBackground
-import androidx.ui.graphics.Color
-import androidx.ui.graphics.RectangleShape
-import androidx.ui.graphics.toArgb
-import androidx.ui.layout.fillMaxSize
-
-open class ComposeNothingInAndroidTap : ComponentActivity() {
-
- private var currentColor = Color.DarkGray
-
- private lateinit var composition: Composition
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.compose_in_android_tap)
-
- findViewById<TextView>(R.id.text1).text =
- "Intended to Demonstrate that when no gestureFilterModifiers are added to compose, " +
- "Compose will not interact with the pointer input stream. This currently " +
- "isn't actually the case however. "
-
- findViewById<TextView>(R.id.text2).text =
- "When you tap anywhere within the bounds of the colored, including the grey box in " +
- "the middle, the color is supposed to change. This currently does not occur " +
- "when you tap on the grey box however."
-
- val container = findViewById<ViewGroup>(R.id.clickableContainer)
- container.isClickable = true
- container.setBackgroundColor(currentColor.toArgb())
- container.setOnClick {
- currentColor = if (currentColor == Color.Green) {
- Color.Red
- } else {
- Color.Green
- }
- container.setBackgroundColor(currentColor.toArgb())
- }
- composition = container.setContent(Recomposer.current()) {
- Box(Modifier.drawBackground(Color.LightGray, RectangleShape).fillMaxSize())
- }
- }
-
- override fun onDestroy() {
- super.onDestroy()
- composition.dispose()
- }
-}
\ No newline at end of file
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeScrollInAndroidScrollDifferentOrientation.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeScrollInAndroidScrollDifferentOrientation.kt
deleted file mode 100644
index afbd12c..0000000
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeScrollInAndroidScrollDifferentOrientation.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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.ui.androidview.demos
-
-import android.os.Bundle
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.activity.ComponentActivity
-import androidx.compose.Composition
-import androidx.compose.Recomposer
-import androidx.ui.core.Modifier
-import androidx.ui.core.setContent
-import androidx.ui.foundation.Box
-import androidx.ui.foundation.HorizontalScroller
-import androidx.ui.foundation.drawBackground
-import androidx.ui.graphics.Color
-import androidx.ui.graphics.RectangleShape
-import androidx.ui.graphics.toArgb
-import androidx.ui.layout.fillMaxHeight
-import androidx.ui.layout.fillMaxWidth
-import androidx.ui.layout.padding
-import androidx.ui.layout.preferredHeight
-import androidx.ui.layout.preferredWidth
-import androidx.ui.unit.dp
-
-open class ComposeScrollInAndroidScrollDifferentOrientation : ComponentActivity() {
-
- private lateinit var composition: Composition
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.compose_in_android_scroll)
-
- findViewById<View>(R.id.container).setBackgroundColor(Color.DarkGray.toArgb())
-
- findViewById<TextView>(R.id.text1).text =
- "Demonstrates that scrolling in Compose and scrolling in Android interop correctly " +
- "when Compose is inside of Android."
-
- findViewById<TextView>(R.id.text2).text =
- "The inner scrollable container is Compose, the other one is Android. You can only " +
- "scroll in one orientation at a time."
-
- val container = findViewById<ViewGroup>(R.id.container)
- composition = container.setContent(Recomposer.current()) {
- HorizontalScroller(
- modifier = Modifier
- .padding(48.dp)
- .drawBackground(Color.Gray, RectangleShape)
- .fillMaxWidth()
- .preferredHeight(456.dp)
- ) {
- Box(
- Modifier
- .padding(48.dp)
- .drawBackground(Color.LightGray, RectangleShape)
- .preferredWidth(360.dp)
- .fillMaxHeight()
- )
- }
- }
- }
-
- override fun onDestroy() {
- super.onDestroy()
- composition.dispose()
- }
-}
\ No newline at end of file
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeScrollInAndroidScrollSameOrientation.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeScrollInAndroidScrollSameOrientation.kt
deleted file mode 100644
index 0fa29be..0000000
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeScrollInAndroidScrollSameOrientation.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * 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.ui.androidview.demos
-
-import android.os.Bundle
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.activity.ComponentActivity
-import androidx.compose.Composition
-import androidx.compose.Recomposer
-import androidx.ui.core.Modifier
-import androidx.ui.core.setContent
-import androidx.ui.foundation.Box
-import androidx.ui.foundation.VerticalScroller
-import androidx.ui.foundation.drawBackground
-import androidx.ui.graphics.Color
-import androidx.ui.graphics.RectangleShape
-import androidx.ui.graphics.toArgb
-import androidx.ui.layout.fillMaxWidth
-import androidx.ui.layout.padding
-import androidx.ui.layout.preferredHeight
-import androidx.ui.unit.dp
-
-open class ComposeScrollInAndroidScrollSameOrientation : ComponentActivity() {
-
- private lateinit var composition: Composition
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.compose_in_android_scroll)
-
- findViewById<View>(R.id.container).setBackgroundColor(Color.DarkGray.toArgb())
-
- findViewById<TextView>(R.id.text1).text =
- "Intended to demonstrate that scrolling between 2 scrollable things interops " +
- "\"correctly\" between Compose and Android when Compose is inside Android. " +
- "This currently does not actually work because nested scrolling interop is " +
- "not complete."
-
- findViewById<TextView>(R.id.text2).text =
- "The outer scrollable container always wins because it always intercepts the scroll " +
- "before the child scrolling container can start scrolling."
-
- val container = findViewById<ViewGroup>(R.id.container)
- composition = container.setContent(Recomposer.current()) {
- VerticalScroller(
- modifier = Modifier
- .padding(48.dp)
- .drawBackground(Color.Gray, RectangleShape)
- .fillMaxWidth()
- .preferredHeight(456.dp)
- ) {
- Box(
- Modifier
- .padding(48.dp)
- .drawBackground(Color.LightGray, RectangleShape)
- .fillMaxWidth()
- .preferredHeight(456.dp)
- )
- }
- }
- }
-
- override fun onDestroy() {
- super.onDestroy()
- composition.dispose()
- }
-}
\ No newline at end of file
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeTapInAndroidScroll.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeTapInAndroidScroll.kt
deleted file mode 100644
index 13518bf..0000000
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeTapInAndroidScroll.kt
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.ui.androidview.demos
-
-import android.os.Bundle
-import android.view.View
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.activity.ComponentActivity
-import androidx.compose.Composition
-import androidx.compose.Recomposer
-import androidx.compose.state
-import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.tapGestureFilter
-import androidx.ui.core.setContent
-import androidx.ui.foundation.Box
-import androidx.ui.foundation.drawBackground
-import androidx.ui.graphics.Color
-import androidx.ui.graphics.RectangleShape
-import androidx.ui.graphics.toArgb
-import androidx.ui.layout.fillMaxWidth
-import androidx.ui.layout.preferredHeight
-import androidx.ui.layout.preferredSize
-import androidx.ui.layout.wrapContentSize
-import androidx.ui.material.ripple.ripple
-import androidx.ui.unit.dp
-
-open class ComposeTapInAndroidScroll : ComponentActivity() {
-
- private lateinit var composition: Composition
-
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.compose_in_android_scroll)
-
- findViewById<View>(R.id.container).setBackgroundColor(Color.DarkGray.toArgb())
-
- findViewById<TextView>(R.id.text1).text =
- "Demonstrates that press gestures and movement gestures interact correctly between " +
- "Android and Compose when Compose is inside of Android."
-
- findViewById<TextView>(R.id.text2).text =
- "The inner box is Compose, the rest is Android. Tapping the inner box will change " +
- "it's color. Putting a finger down on the inner box and dragging vertically," +
- " will cause the outer Android ScrollView to scroll and removing the finger " +
- "from the screen will not cause the Compose box to change colors. "
-
- val container = findViewById<ViewGroup>(R.id.container)
- composition = container.setContent(Recomposer.current()) {
-
- val currentColor = state { Color.LightGray }
-
- val tap =
- Modifier.tapGestureFilter {
- currentColor.value =
- if (currentColor.value == Color.Blue) Color.Yellow else Color.Blue
- }
-
- Box(
- Modifier
- .drawBackground(Color.Gray, RectangleShape)
- .fillMaxWidth()
- .preferredHeight(456.dp)
- .wrapContentSize()
- .ripple()
- .plus(tap)
- .drawBackground(currentColor.value, RectangleShape)
- .preferredSize(192.dp)
- )
- }
- }
-
- override fun onDestroy() {
- super.onDestroy()
- composition.dispose()
- }
-}
\ No newline at end of file
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeTapInAndroidTap.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeTapInAndroidTap.kt
deleted file mode 100644
index 73f84b5..0000000
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/ComposeTapInAndroidTap.kt
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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.ui.androidview.demos
-
-import android.annotation.SuppressLint
-import android.os.Bundle
-import android.view.ViewGroup
-import android.widget.TextView
-import androidx.activity.ComponentActivity
-import androidx.compose.Composition
-import androidx.compose.Recomposer
-import androidx.compose.state
-import androidx.ui.androidview.adapters.setOnClick
-import androidx.ui.core.Modifier
-import androidx.ui.core.gesture.tapGestureFilter
-import androidx.ui.core.setContent
-import androidx.ui.foundation.Box
-import androidx.ui.foundation.drawBackground
-import androidx.ui.graphics.Color
-import androidx.ui.graphics.RectangleShape
-import androidx.ui.graphics.toArgb
-import androidx.ui.layout.Column
-import androidx.ui.layout.fillMaxSize
-
-open class ComposeTapInAndroidTap : ComponentActivity() {
-
- private var currentColor = Color.DarkGray
-
- private lateinit var composition: Composition
-
- @SuppressLint("SetTextI18n")
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- setContentView(R.layout.compose_in_android_tap)
-
- findViewById<TextView>(R.id.text1).text =
- "Demonstrates correct interop with simple tapping"
- findViewById<TextView>(R.id.text2).text =
- "The inner box is Compose, the outer is Android. When you tap on the inner box, " +
- "only it changes colors. When you tap on the outer box, only the outer box " +
- "changes colors."
-
- val container = findViewById<ViewGroup>(R.id.clickableContainer)
- container.isClickable = true
- container.setBackgroundColor(currentColor.toArgb())
- container.setOnClick {
- currentColor = if (currentColor == Color.Green) {
- Color.Red
- } else {
- Color.Green
- }
- container.setBackgroundColor(currentColor.toArgb())
- }
-
- composition = container.setContent(Recomposer.current()) {
-
- val currentColor = state { Color.LightGray }
-
- val tap =
- Modifier.tapGestureFilter {
- currentColor.value =
- if (currentColor.value == Color.Blue) Color.Yellow else Color.Blue
- }
-
- Column {
- Box(
- tap + Modifier.drawBackground(currentColor.value, RectangleShape).fillMaxSize()
- )
- }
- }
- }
-
- override fun onDestroy() {
- super.onDestroy()
- composition.dispose()
- }
-}
\ No newline at end of file
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInterop.kt b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt
similarity index 61%
rename from ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInterop.kt
rename to ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt
index 4a8eef9..1e42453 100644
--- a/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInterop.kt
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropAndroidInCompose.kt
@@ -16,6 +16,7 @@
package androidx.ui.androidview.demos
+import android.graphics.Color
import android.view.View
import android.view.ViewGroup
import androidx.compose.Composable
@@ -23,48 +24,32 @@
import androidx.ui.core.Alignment
import androidx.ui.core.Modifier
import androidx.ui.core.gesture.tapGestureFilter
-import androidx.ui.demos.common.ActivityDemo
import androidx.ui.demos.common.ComposableDemo
import androidx.ui.demos.common.DemoCategory
import androidx.ui.foundation.Box
import androidx.ui.foundation.HorizontalScroller
import androidx.ui.foundation.Text
+import androidx.ui.foundation.VerticalScroller
+import androidx.ui.foundation.drawBackground
import androidx.ui.layout.Column
import androidx.ui.layout.fillMaxSize
+import androidx.ui.layout.padding
+import androidx.ui.layout.preferredHeight
import androidx.ui.layout.preferredSize
import androidx.ui.layout.wrapContentSize
import androidx.ui.unit.dp
import androidx.ui.viewinterop.AndroidView
-val ComposeInAndroidDemos = DemoCategory(
- "Compose in Android Interop", listOf(
- ActivityDemo(
- "Compose with no gestures in Android tap",
- ComposeNothingInAndroidTap::class
- ),
- ActivityDemo(
- "Compose tap in Android tap",
- ComposeTapInAndroidTap::class
- ),
- ActivityDemo(
- "Compose tap in Android scroll",
- ComposeTapInAndroidScroll::class
- ),
- ActivityDemo(
- "Compose scroll in Android scroll (same orientation)",
- ComposeScrollInAndroidScrollSameOrientation::class
- ),
- ActivityDemo(
- "Compose scroll in Android scroll (different orientations)",
- ComposeScrollInAndroidScrollDifferentOrientation::class
- )
- )
-)
-
val AndroidInComposeDemos = DemoCategory("Android In Compose Interop", listOf(
ComposableDemo("4 Android tap in Compose") { FourAndroidTapInCompose() },
ComposableDemo("Android tap in Compose tap") { AndroidTapInComposeTap() },
- ComposableDemo("Android tap in Compose scroll") { AndroidTapInComposeScroll() }
+ ComposableDemo("Android tap in Compose scroll") { AndroidTapInComposeScroll() },
+ ComposableDemo("Android scroll in Compose scroll (different orientation)") {
+ AndroidScrollInComposeScrollDifferentOrientation()
+ },
+ ComposableDemo("Android scroll in Compose scroll (same orientation)") {
+ AndroidScrollInComposeScrollSameOrientation()
+ }
))
@Composable
@@ -81,19 +66,19 @@
.wrapContentSize(Alignment.Center)
.preferredSize(240.dp)
) {
- AndroidView(R.layout.pointer_interop_targeting_demo) { view ->
+ AndroidView(R.layout.android_4_buttons_in_compose) { view ->
view as ViewGroup
view.findViewById<View>(R.id.buttonBlue).setOnClick {
- view.setBackgroundColor(android.graphics.Color.BLUE)
+ view.setBackgroundColor(Color.BLUE)
}
view.findViewById<View>(R.id.buttonRed).setOnClick {
- view.setBackgroundColor(android.graphics.Color.RED)
+ view.setBackgroundColor(Color.RED)
}
view.findViewById<View>(R.id.buttonGreen).setOnClick {
- view.setBackgroundColor(android.graphics.Color.GREEN)
+ view.setBackgroundColor(Color.GREEN)
}
view.findViewById<View>(R.id.buttonYellow).setOnClick {
- view.setBackgroundColor(android.graphics.Color.YELLOW)
+ view.setBackgroundColor(Color.YELLOW)
}
}
}
@@ -105,7 +90,7 @@
var theView: View? = null
val onTap: () -> Unit = {
- theView?.setBackgroundColor(android.graphics.Color.BLUE)
+ theView?.setBackgroundColor(Color.BLUE)
}
Column {
@@ -127,11 +112,11 @@
.wrapContentSize(Alignment.Center)
.preferredSize(240.dp)
) {
- AndroidView(R.layout.pointer_interop_tap_in_tap_demo) { view ->
+ AndroidView(R.layout.android_tap_in_compose_tap) { view ->
theView = view
- theView?.setBackgroundColor(android.graphics.Color.GREEN)
+ theView?.setBackgroundColor(Color.GREEN)
view.findViewById<View>(R.id.buttonRed).setOnClick {
- theView?.setBackgroundColor(android.graphics.Color.RED)
+ theView?.setBackgroundColor(Color.RED)
}
}
}
@@ -153,33 +138,73 @@
"will not be clicked when released."
)
HorizontalScroller {
- AndroidView(R.layout.pointer_interop_tap_in_drag_demo) { view ->
- view.setBackgroundColor(android.graphics.Color.YELLOW)
+ AndroidView(R.layout.android_tap_in_compose_scroll) { view ->
+ view.setBackgroundColor(Color.YELLOW)
view.findViewById<View>(R.id.buttonRed).apply {
isClickable = false
setOnClick {
- view.setBackgroundColor(android.graphics.Color.RED)
+ view.setBackgroundColor(Color.RED)
}
}
view.findViewById<View>(R.id.buttonGreen).apply {
isClickable = false
setOnClick {
- view.setBackgroundColor(android.graphics.Color.GREEN)
+ view.setBackgroundColor(Color.GREEN)
}
}
view.findViewById<View>(R.id.buttonBlue).apply {
isClickable = false
setOnClick {
- view.setBackgroundColor(android.graphics.Color.BLUE)
+ view.setBackgroundColor(Color.BLUE)
}
}
view.findViewById<View>(R.id.buttonYellow).apply {
isClickable = false
setOnClick {
- view.setBackgroundColor(android.graphics.Color.YELLOW)
+ view.setBackgroundColor(Color.YELLOW)
}
}
}
}
}
+}
+
+@Composable
+private fun AndroidScrollInComposeScrollDifferentOrientation() {
+ Column {
+ Text("Demonstrates correct \"scroll orientation\" locking when something scrollable in " +
+ "Android is nested inside something scrollable in Compose.")
+ Text("You should only be able to scroll in one orientation at a time.")
+ HorizontalScroller(modifier = Modifier.drawBackground(androidx.ui.graphics.Color.Blue)) {
+ Box(modifier = Modifier.padding(96.dp).drawBackground(androidx.ui.graphics.Color.Red)) {
+ AndroidView(R.layout.android_scroll_in_compose_scroll_different_orientation)
+ }
+ }
+ }
+}
+
+@Composable
+private fun AndroidScrollInComposeScrollSameOrientation() {
+ Column {
+ Text("Supposed to demonstrate correct nested scrolling when something scrollable in " +
+ "Android is inside something scrollable in Compose.")
+ Text(
+ "This doesn't actually work because nested scrolling isn't implemented between " +
+ "Compose and Android. Normally, this lack of implementation would mean the " +
+ "parent would always intercept first and thus block the child from ever " +
+ "scrolling. However, currently, the touch slop for Android is smaller than " +
+ "that for Compose, and thus the child scrolls and prevents the parent from " +
+ "intercepting. "
+ )
+ VerticalScroller(modifier = Modifier.drawBackground(androidx.ui.graphics.Color.Blue)) {
+ Box(
+ modifier = Modifier
+ .padding(96.dp)
+ .drawBackground(androidx.ui.graphics.Color.Red)
+ .preferredHeight(750.dp)
+ ) {
+ AndroidView(R.layout.android_scroll_in_compose_scroll_same_orientation)
+ }
+ }
+ }
}
\ No newline at end of file
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
new file mode 100644
index 0000000..272f6ca
--- /dev/null
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/java/androidx/ui/androidview/demos/PointerInputInteropComposeInAndroid.kt
@@ -0,0 +1,317 @@
+/*
+ * 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.ui.androidview.demos
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.activity.ComponentActivity
+import androidx.compose.Composition
+import androidx.compose.Recomposer
+import androidx.compose.state
+import androidx.ui.androidview.adapters.setOnClick
+import androidx.ui.core.Modifier
+import androidx.ui.core.gesture.tapGestureFilter
+import androidx.ui.core.setContent
+import androidx.ui.demos.common.ActivityDemo
+import androidx.ui.demos.common.DemoCategory
+import androidx.ui.foundation.Box
+import androidx.ui.foundation.HorizontalScroller
+import androidx.ui.foundation.VerticalScroller
+import androidx.ui.foundation.drawBackground
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.RectangleShape
+import androidx.ui.graphics.toArgb
+import androidx.ui.layout.Column
+import androidx.ui.layout.fillMaxHeight
+import androidx.ui.layout.fillMaxSize
+import androidx.ui.layout.fillMaxWidth
+import androidx.ui.layout.padding
+import androidx.ui.layout.preferredHeight
+import androidx.ui.layout.preferredSize
+import androidx.ui.layout.preferredWidth
+import androidx.ui.layout.wrapContentSize
+import androidx.ui.material.ripple.ripple
+import androidx.ui.unit.dp
+
+val ComposeInAndroidDemos = DemoCategory(
+ "Compose in Android Interop", listOf(
+ ActivityDemo(
+ "Compose with no gestures in Android tap",
+ ComposeNothingInAndroidTap::class
+ ),
+ ActivityDemo(
+ "Compose tap in Android tap",
+ ComposeTapInAndroidTap::class
+ ),
+ ActivityDemo(
+ "Compose tap in Android scroll",
+ ComposeTapInAndroidScroll::class
+ ),
+ ActivityDemo(
+ "Compose scroll in Android scroll (same orientation)",
+ ComposeScrollInAndroidScrollSameOrientation::class
+ ),
+ ActivityDemo(
+ "Compose scroll in Android scroll (different orientations)",
+ ComposeScrollInAndroidScrollDifferentOrientation::class
+ )
+ )
+)
+
+open class ComposeNothingInAndroidTap : ComponentActivity() {
+
+ private var currentColor = Color.DarkGray
+
+ private lateinit var composition: Composition
+
+ @SuppressLint("SetTextI18n")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.compose_in_android_tap)
+
+ findViewById<TextView>(R.id.text1).text =
+ "Intended to Demonstrate that when no gestureFilterModifiers are added to compose, " +
+ "Compose will not interact with the pointer input stream. This currently " +
+ "isn't actually the case however. "
+
+ findViewById<TextView>(R.id.text2).text =
+ "When you tap anywhere within the bounds of the colored, including the grey box in " +
+ "the middle, the color is supposed to change. This currently does not occur " +
+ "when you tap on the grey box however."
+
+ val container = findViewById<ViewGroup>(R.id.clickableContainer)
+ container.isClickable = true
+ container.setBackgroundColor(currentColor.toArgb())
+ container.setOnClick {
+ currentColor = if (currentColor == Color.Green) {
+ Color.Red
+ } else {
+ Color.Green
+ }
+ container.setBackgroundColor(currentColor.toArgb())
+ }
+ composition = container.setContent(Recomposer.current()) {
+ Box(Modifier.drawBackground(Color.LightGray, RectangleShape).fillMaxSize())
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ composition.dispose()
+ }
+}
+
+open class ComposeTapInAndroidTap : ComponentActivity() {
+
+ private var currentColor = Color.DarkGray
+
+ private lateinit var composition: Composition
+
+ @SuppressLint("SetTextI18n")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.compose_in_android_tap)
+
+ findViewById<TextView>(R.id.text1).text =
+ "Demonstrates correct interop with simple tapping"
+ findViewById<TextView>(R.id.text2).text =
+ "The inner box is Compose, the outer is Android. When you tap on the inner box, " +
+ "only it changes colors. When you tap on the outer box, only the outer box " +
+ "changes colors."
+
+ val container = findViewById<ViewGroup>(R.id.clickableContainer)
+ container.isClickable = true
+ container.setBackgroundColor(currentColor.toArgb())
+ container.setOnClick {
+ currentColor = if (currentColor == Color.Green) {
+ Color.Red
+ } else {
+ Color.Green
+ }
+ container.setBackgroundColor(currentColor.toArgb())
+ }
+
+ composition = container.setContent(Recomposer.current()) {
+
+ val currentColor = state { Color.LightGray }
+
+ val tap =
+ Modifier.tapGestureFilter {
+ currentColor.value =
+ if (currentColor.value == Color.Blue) Color.Yellow else Color.Blue
+ }
+
+ Column {
+ Box(
+ tap + Modifier.drawBackground(currentColor.value, RectangleShape).fillMaxSize()
+ )
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ composition.dispose()
+ }
+}
+
+open class ComposeTapInAndroidScroll : ComponentActivity() {
+
+ private lateinit var composition: Composition
+
+ @SuppressLint("SetTextI18n")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.compose_in_android_scroll)
+
+ findViewById<View>(R.id.container).setBackgroundColor(Color.DarkGray.toArgb())
+
+ findViewById<TextView>(R.id.text1).text =
+ "Demonstrates that press gestures and movement gestures interact correctly between " +
+ "Android and Compose when Compose is inside of Android."
+
+ findViewById<TextView>(R.id.text2).text =
+ "The inner box is Compose, the rest is Android. Tapping the inner box will change " +
+ "it's color. Putting a finger down on the inner box and dragging vertically," +
+ " will cause the outer Android ScrollView to scroll and removing the finger " +
+ "from the screen will not cause the Compose box to change colors. "
+
+ val container = findViewById<ViewGroup>(R.id.container)
+ composition = container.setContent(Recomposer.current()) {
+
+ val currentColor = state { Color.LightGray }
+
+ val tap =
+ Modifier.tapGestureFilter {
+ currentColor.value =
+ if (currentColor.value == Color.Blue) Color.Yellow else Color.Blue
+ }
+
+ Box(
+ Modifier
+ .drawBackground(Color.Gray, RectangleShape)
+ .fillMaxWidth()
+ .preferredHeight(456.dp)
+ .wrapContentSize()
+ .ripple()
+ .plus(tap)
+ .drawBackground(currentColor.value, RectangleShape)
+ .preferredSize(192.dp)
+ )
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ composition.dispose()
+ }
+}
+
+open class ComposeScrollInAndroidScrollSameOrientation : ComponentActivity() {
+
+ private lateinit var composition: Composition
+
+ @SuppressLint("SetTextI18n")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.compose_in_android_scroll)
+
+ findViewById<View>(R.id.container).setBackgroundColor(Color.DarkGray.toArgb())
+
+ findViewById<TextView>(R.id.text1).text =
+ "Intended to demonstrate that scrolling between 2 scrollable things interops " +
+ "\"correctly\" between Compose and Android when Compose is inside Android. " +
+ "This currently does not actually work because nested scrolling interop is " +
+ "not complete."
+
+ findViewById<TextView>(R.id.text2).text =
+ "The outer scrollable container always wins because it always intercepts the scroll " +
+ "before the child scrolling container can start scrolling."
+
+ val container = findViewById<ViewGroup>(R.id.container)
+ composition = container.setContent(Recomposer.current()) {
+ VerticalScroller(
+ modifier = Modifier
+ .padding(48.dp)
+ .drawBackground(Color.Gray, RectangleShape)
+ .fillMaxWidth()
+ .preferredHeight(456.dp)
+ ) {
+ Box(
+ Modifier
+ .padding(48.dp)
+ .drawBackground(Color.LightGray, RectangleShape)
+ .fillMaxWidth()
+ .preferredHeight(456.dp)
+ )
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ composition.dispose()
+ }
+}
+
+open class ComposeScrollInAndroidScrollDifferentOrientation : ComponentActivity() {
+
+ private lateinit var composition: Composition
+
+ @SuppressLint("SetTextI18n")
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.compose_in_android_scroll)
+
+ findViewById<View>(R.id.container).setBackgroundColor(Color.DarkGray.toArgb())
+
+ findViewById<TextView>(R.id.text1).text =
+ "Demonstrates that scrolling in Compose and scrolling in Android interop correctly " +
+ "when Compose is inside of Android."
+
+ findViewById<TextView>(R.id.text2).text =
+ "The inner scrollable container is Compose, the other one is Android. You can only " +
+ "scroll in one orientation at a time."
+
+ val container = findViewById<ViewGroup>(R.id.container)
+ composition = container.setContent(Recomposer.current()) {
+ HorizontalScroller(
+ modifier = Modifier
+ .padding(48.dp)
+ .drawBackground(Color.Gray, RectangleShape)
+ .fillMaxWidth()
+ .preferredHeight(456.dp)
+ ) {
+ Box(
+ Modifier
+ .padding(48.dp)
+ .drawBackground(Color.LightGray, RectangleShape)
+ .preferredWidth(360.dp)
+ .fillMaxHeight()
+ )
+ }
+ }
+ }
+
+ override fun onDestroy() {
+ super.onDestroy()
+ composition.dispose()
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/pointer_interop_targeting_demo.xml b/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_4_buttons_in_compose.xml
similarity index 100%
rename from ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/pointer_interop_targeting_demo.xml
rename to ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_4_buttons_in_compose.xml
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_scroll_in_compose_scroll_different_orientation.xml b/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_scroll_in_compose_scroll_different_orientation.xml
new file mode 100644
index 0000000..63de95c
--- /dev/null
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_scroll_in_compose_scroll_different_orientation.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ 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.
+ -->
+
+<ScrollView android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <LinearLayout
+ android:layout_width="500dp"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="center">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="1" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="2" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="3" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="4" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="5" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="6" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="7" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="8" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="9" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="10" />
+ </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_scroll_in_compose_scroll_same_orientation.xml b/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_scroll_in_compose_scroll_same_orientation.xml
new file mode 100644
index 0000000..b0044d9
--- /dev/null
+++ b/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_scroll_in_compose_scroll_same_orientation.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ 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.
+ -->
+
+<ScrollView android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <LinearLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:gravity="center">
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="1" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="2" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="3" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="4" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="5" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="6" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="7" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="8" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="9" />
+ <TextView
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textSize="96sp"
+ android:text="10" />
+ </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/pointer_interop_tap_in_drag_demo.xml b/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_tap_in_compose_scroll.xml
similarity index 100%
rename from ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/pointer_interop_tap_in_drag_demo.xml
rename to ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_tap_in_compose_scroll.xml
diff --git a/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/pointer_interop_tap_in_tap_demo.xml b/ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_tap_in_compose_tap.xml
similarity index 100%
rename from ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/pointer_interop_tap_in_tap_demo.xml
rename to ui/ui-android-view/integration-tests/android-view-demos/src/main/res/layout/android_tap_in_compose_tap.xml
diff --git a/ui/ui-animation/api/0.1.0-dev11.txt b/ui/ui-animation/api/0.1.0-dev11.txt
index 125e094..8ca8f65 100644
--- a/ui/ui-animation/api/0.1.0-dev11.txt
+++ b/ui/ui-animation/api/0.1.0-dev11.txt
@@ -27,7 +27,7 @@
}
public final class CrossfadeKt {
- method public static <T> void Crossfade(T? current, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
+ method public static <T> void Crossfade(T? current, androidx.animation.AnimationBuilder<java.lang.Float> animation = androidx.animation.TweenBuilder(), kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
}
public final class DisposableAnimationClock implements androidx.animation.AnimationClockObservable {
diff --git a/ui/ui-animation/api/current.txt b/ui/ui-animation/api/current.txt
index 125e094..8ca8f65 100644
--- a/ui/ui-animation/api/current.txt
+++ b/ui/ui-animation/api/current.txt
@@ -27,7 +27,7 @@
}
public final class CrossfadeKt {
- method public static <T> void Crossfade(T? current, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
+ method public static <T> void Crossfade(T? current, androidx.animation.AnimationBuilder<java.lang.Float> animation = androidx.animation.TweenBuilder(), kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
}
public final class DisposableAnimationClock implements androidx.animation.AnimationClockObservable {
diff --git a/ui/ui-animation/api/public_plus_experimental_0.1.0-dev11.txt b/ui/ui-animation/api/public_plus_experimental_0.1.0-dev11.txt
index 125e094..8ca8f65 100644
--- a/ui/ui-animation/api/public_plus_experimental_0.1.0-dev11.txt
+++ b/ui/ui-animation/api/public_plus_experimental_0.1.0-dev11.txt
@@ -27,7 +27,7 @@
}
public final class CrossfadeKt {
- method public static <T> void Crossfade(T? current, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
+ method public static <T> void Crossfade(T? current, androidx.animation.AnimationBuilder<java.lang.Float> animation = androidx.animation.TweenBuilder(), kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
}
public final class DisposableAnimationClock implements androidx.animation.AnimationClockObservable {
diff --git a/ui/ui-animation/api/public_plus_experimental_current.txt b/ui/ui-animation/api/public_plus_experimental_current.txt
index 125e094..8ca8f65 100644
--- a/ui/ui-animation/api/public_plus_experimental_current.txt
+++ b/ui/ui-animation/api/public_plus_experimental_current.txt
@@ -27,7 +27,7 @@
}
public final class CrossfadeKt {
- method public static <T> void Crossfade(T? current, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
+ method public static <T> void Crossfade(T? current, androidx.animation.AnimationBuilder<java.lang.Float> animation = androidx.animation.TweenBuilder(), kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
}
public final class DisposableAnimationClock implements androidx.animation.AnimationClockObservable {
diff --git a/ui/ui-animation/api/restricted_0.1.0-dev11.txt b/ui/ui-animation/api/restricted_0.1.0-dev11.txt
index 125e094..8ca8f65 100644
--- a/ui/ui-animation/api/restricted_0.1.0-dev11.txt
+++ b/ui/ui-animation/api/restricted_0.1.0-dev11.txt
@@ -27,7 +27,7 @@
}
public final class CrossfadeKt {
- method public static <T> void Crossfade(T? current, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
+ method public static <T> void Crossfade(T? current, androidx.animation.AnimationBuilder<java.lang.Float> animation = androidx.animation.TweenBuilder(), kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
}
public final class DisposableAnimationClock implements androidx.animation.AnimationClockObservable {
diff --git a/ui/ui-animation/api/restricted_current.txt b/ui/ui-animation/api/restricted_current.txt
index 125e094..8ca8f65 100644
--- a/ui/ui-animation/api/restricted_current.txt
+++ b/ui/ui-animation/api/restricted_current.txt
@@ -27,7 +27,7 @@
}
public final class CrossfadeKt {
- method public static <T> void Crossfade(T? current, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
+ method public static <T> void Crossfade(T? current, androidx.animation.AnimationBuilder<java.lang.Float> animation = androidx.animation.TweenBuilder(), kotlin.jvm.functions.Function1<? super T,kotlin.Unit> children);
}
public final class DisposableAnimationClock implements androidx.animation.AnimationClockObservable {
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/AnimatableSeekBarDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/AnimatableSeekBarDemo.kt
index 9b40566..15804e9 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/AnimatableSeekBarDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/AnimatableSeekBarDemo.kt
@@ -32,12 +32,11 @@
import androidx.ui.core.gesture.pressIndicatorGestureFilter
import androidx.ui.core.gesture.rawDragGestureFilter
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.Text
import androidx.ui.geometry.Offset
-import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
import androidx.ui.layout.Column
import androidx.ui.layout.fillMaxWidth
import androidx.ui.layout.padding
@@ -68,31 +67,27 @@
initState = "start",
toState = "end"
) { state ->
- val paint = remember { Paint() }
- Canvas(Modifier.preferredSize(600.dp, 400.dp)) {
- val rect = Rect(
- 0f, 0f, size.width.value * 0.2f,
- size.width.value * 0.2f
- )
- drawRect(rect, paint.apply {
- color = Color(1.0f, 0f, 0f, state[alphaKey])
- })
-
- drawRect(rect.translate(state[offset1] * size.width.value, 0f),
- paint.apply {
- color = Color(0f, 0f, 1f, state[alphaKey])
- })
+ Canvas2(Modifier.preferredSize(600.dp, 400.dp)) {
+ val rectSize = size * 0.2f
+ drawRect(Color(1.0f, 0f, 0f, state[alphaKey]), size = rectSize)
drawRect(
- rect.translate(state[offset2] * size.width.value, 0f),
- paint.apply {
- color = Color(0f, 1f, 1f, state[alphaKey])
- })
+ Color(0f, 0f, 1f, state[alphaKey]),
+ topLeft = Offset(state[offset1] * size.width, 0.0f),
+ size = rectSize
+ )
- drawRect(rect.translate(state[offset3] * size.width.value, 0f),
- paint.apply {
- color = Color(0f, 1f, 0f, state[alphaKey])
- })
+ drawRect(
+ Color(0f, 1f, 1f, state[alphaKey]),
+ topLeft = Offset(state[offset2] * size.width, 0.0f),
+ size = rectSize
+ )
+
+ drawRect(
+ Color(0f, 1f, 0f, state[alphaKey]),
+ topLeft = Offset(state[offset3] * size.width, 0.0f),
+ size = rectSize
+ )
}
}
}
@@ -128,26 +123,28 @@
@Composable
fun DrawSeekBar(modifier: Modifier = Modifier, x: Float, clock: ManualAnimationClock) {
- val paint = remember { Paint() }
- Canvas(modifier.fillMaxWidth().preferredHeight(60.dp)) {
- val centerY = size.height.value / 2
- val xConstraint = x.coerceIn(0f, size.width.value)
- clock.clockTimeMillis = (400 * (x / size.width.value)).toLong().coerceIn(0, 399)
+ Canvas2(modifier.fillMaxWidth().preferredHeight(60.dp)) {
+ val xConstraint = x.coerceIn(0f, size.width)
+ clock.clockTimeMillis = (400 * (x / size.width)).toLong().coerceIn(0, 399)
// draw bar
- paint.color = Color.Gray
+ val barHeight = 10.0f
+ val offset = Offset(0.0f, center.dy - 5)
drawRect(
- Rect(0f, centerY - 5, size.width.value, centerY + 5),
- paint
+ Color.Gray,
+ topLeft = offset,
+ size = Size(size.width, barHeight)
)
- paint.color = Color.Magenta
drawRect(
- Rect(0f, centerY - 5, xConstraint, centerY + 5),
- paint
+ Color.Magenta,
+ topLeft = offset,
+ size = Size(xConstraint, barHeight)
)
// draw ticker
drawCircle(
- Offset(xConstraint, centerY), 40f, paint
+ Color.Magenta,
+ center = Offset(xConstraint, center.dy),
+ radius = 40f
)
}
}
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt
index 40c83fb..785608f 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt
@@ -22,18 +22,17 @@
import androidx.animation.TargetAnimation
import androidx.animation.fling
import androidx.compose.Composable
-import androidx.compose.remember
import androidx.compose.state
import androidx.ui.animation.animatedFloat
-import androidx.ui.core.DrawScope
import androidx.ui.core.Modifier
import androidx.ui.core.gesture.DragObserver
import androidx.ui.core.gesture.rawDragGestureFilter
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.Text
-import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
+import androidx.ui.graphics.painter.CanvasScope
import androidx.ui.layout.Column
import androidx.ui.layout.fillMaxWidth
import androidx.ui.layout.padding
@@ -77,9 +76,9 @@
})
}
})
- val paint = remember { Paint() }
- Canvas(gesture.fillMaxWidth().preferredHeight(400.dp)) {
- val width = size.width.value / 2f
+
+ Canvas2(gesture.fillMaxWidth().preferredHeight(400.dp)) {
+ val width = size.width / 2f
val scroll = animScroll.value + width / 2
itemWidth.value = width
if (DEBUG) {
@@ -88,16 +87,15 @@
" AnimatedFloat: ${animScroll.value}"
)
}
- drawItems(scroll, width, size.height.value, paint)
+ drawItems(scroll, width, size.height)
}
}
}
-private fun DrawScope.drawItems(
+private fun CanvasScope.drawItems(
scrollPosition: Float,
width: Float,
- height: Float,
- paint: Paint
+ height: Float
) {
var startingPos = scrollPosition % width
if (startingPos > 0) {
@@ -108,20 +106,24 @@
if (startingColorIndex < 0) {
startingColorIndex += colors.size
}
- paint.color = colors[startingColorIndex]
+
+ val size = Size(width - 20, height)
drawRect(
- Rect(startingPos + 10, 0f, startingPos + width - 10, height),
- paint
+ colors[startingColorIndex],
+ topLeft = Offset(startingPos + 10, 0f),
+ size = size
)
- paint.color = colors[(startingColorIndex + colors.size - 1) % colors.size]
+
drawRect(
- Rect(startingPos + width + 10, 0f, startingPos + width * 2 - 10, height),
- paint
+ colors[(startingColorIndex + colors.size - 1) % colors.size],
+ topLeft = Offset(startingPos + width + 10, 0.0f),
+ size = size
)
- paint.color = colors[(startingColorIndex + colors.size - 2) % colors.size]
+
drawRect(
- Rect(startingPos + width * 2 + 10, 0f, startingPos + width * 3 - 10, height),
- paint
+ colors[(startingColorIndex + colors.size - 2) % colors.size],
+ topLeft = Offset(startingPos + width * 2 + 10, 0.0f),
+ size = size
)
}
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/GestureBasedAnimationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/GestureBasedAnimationDemo.kt
index aa1102e..e23ff6e 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/GestureBasedAnimationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/GestureBasedAnimationDemo.kt
@@ -19,16 +19,15 @@
import androidx.animation.FloatPropKey
import androidx.animation.transitionDefinition
import androidx.compose.Composable
-import androidx.compose.remember
import androidx.compose.state
import androidx.ui.animation.ColorPropKey
import androidx.ui.animation.Transition
import androidx.ui.core.Modifier
import androidx.ui.core.gesture.pressIndicatorGestureFilter
-import androidx.ui.foundation.Canvas
-import androidx.ui.geometry.Rect
+import androidx.ui.foundation.Canvas2
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
import androidx.ui.layout.fillMaxSize
private const val halfSize = 200f
@@ -73,16 +72,11 @@
@Composable
private fun ScaledColorRect(modifier: Modifier = Modifier, scale: Float, color: Color) {
- val paint = remember { Paint() }
- Canvas(modifier.fillMaxSize()) {
- val centerX = size.width.value / 2
- val centerY = size.height.value / 2
- paint.color = color
+ Canvas2(modifier.fillMaxSize()) {
drawRect(
- Rect(
- centerX - halfSize * scale, centerY - halfSize * scale,
- centerX + halfSize * scale, centerY + halfSize * scale
- ), paint
+ color,
+ topLeft = Offset(center.dx - halfSize * scale, center.dy - halfSize * scale),
+ size = Size(halfSize * 2 * scale, halfSize * 2 * scale)
)
}
}
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/MultiDimensionalAnimationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/MultiDimensionalAnimationDemo.kt
index cb073a5..dbdd101 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/MultiDimensionalAnimationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/MultiDimensionalAnimationDemo.kt
@@ -25,11 +25,12 @@
import androidx.ui.animation.RectPropKey
import androidx.ui.animation.Transition
import androidx.ui.core.Modifier
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.Clickable
+import androidx.ui.geometry.Offset
import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
import androidx.ui.layout.fillMaxSize
@Composable
@@ -52,13 +53,16 @@
},
toState = currentState.value
) { state ->
- val paint = remember { Paint() }
- Canvas(modifier = Modifier.fillMaxSize()) {
- width.value = size.width.value
- height.value = size.height.value
+ Canvas2(modifier = Modifier.fillMaxSize()) {
+ width.value = size.width
+ height.value = size.height
- paint.color = state[background]
- drawRect(state[bounds], paint)
+ val bounds = state[bounds]
+ drawRect(
+ state[background],
+ topLeft = Offset(bounds.left, bounds.top),
+ size = Size(bounds.width, bounds.height)
+ )
}
}
}
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/RepeatedRotationDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/RepeatedRotationDemo.kt
index 9060849..c4c6297 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/RepeatedRotationDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/RepeatedRotationDemo.kt
@@ -25,10 +25,10 @@
import androidx.ui.core.Alignment
import androidx.ui.core.Modifier
import androidx.ui.core.gesture.tapGestureFilter
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.Text
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
+import androidx.ui.graphics.painter.rotate
import androidx.ui.layout.Arrangement
import androidx.ui.layout.Column
import androidx.ui.layout.fillMaxSize
@@ -37,7 +37,6 @@
import androidx.ui.text.TextStyle
import androidx.ui.unit.dp
import androidx.ui.unit.sp
-import androidx.ui.unit.toRect
@Composable
fun RepeatedRotationDemo() {
@@ -62,13 +61,10 @@
definition = definition,
toState = state.value
) { state ->
- Canvas(Modifier.preferredSize(100.dp)) {
- // TODO (njawad) replace with save lambda when multi children DrawNodes are supported
- save()
- rotate(state[rotation])
- drawRect(size.toRect(), Paint().apply { color = Color(0xFF00FF00) })
- // TODO (njawad) replace with save lambda when multi children DrawNodes are supported
- restore()
+ Canvas2(Modifier.preferredSize(100.dp)) {
+ rotate(state[rotation], 0.0f, 0.0f) {
+ drawRect(Color(0xFF00FF00))
+ }
}
}
}
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt
index 9a6d2e8..d987ca9 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt
@@ -21,18 +21,17 @@
import androidx.animation.PhysicsBuilder
import androidx.animation.fling
import androidx.compose.Composable
-import androidx.compose.remember
import androidx.compose.state
import androidx.ui.animation.animatedFloat
-import androidx.ui.core.DrawScope
import androidx.ui.core.Modifier
import androidx.ui.core.gesture.DragObserver
import androidx.ui.core.gesture.rawDragGestureFilter
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.Text
-import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
+import androidx.ui.graphics.painter.CanvasScope
import androidx.ui.layout.Column
import androidx.ui.layout.fillMaxHeight
import androidx.ui.layout.fillMaxWidth
@@ -68,9 +67,8 @@
})
}
})
- val paint = remember { Paint() }
- Canvas(gesture.fillMaxWidth().preferredHeight(400.dp)) {
- itemWidth.value = size.width.value / 2f
+ Canvas2(gesture.fillMaxWidth().preferredHeight(400.dp)) {
+ itemWidth.value = size.width / 2f
if (isFlinging.value) {
// Figure out what position to spring back to
val target = animScroll.targetValue
@@ -102,13 +100,13 @@
" scroll value: ${animScroll.value}"
)
}
- drawRects(paint, animScroll.value)
+ drawRects(animScroll.value)
}
}
}
-private fun DrawScope.drawRects(paint: Paint, animScroll: Float) {
- val width = size.width.value / 2f
+private fun CanvasScope.drawRects(animScroll: Float) {
+ val width = size.width / 2f
val scroll = animScroll + width / 2
var startingPos = scroll % width
if (startingPos > 0) {
@@ -118,26 +116,25 @@
if (startingColorIndex < 0) {
startingColorIndex += colors.size
}
- paint.color = colors[startingColorIndex]
+
+ val rectSize = Size(width - 20.0f, size.height)
+
drawRect(
- Rect(
- startingPos + 10, 0f, startingPos + width - 10,
- size.height.value
- ), paint
+ colors[startingColorIndex],
+ topLeft = Offset(startingPos + 10, 0f),
+ size = rectSize
)
- paint.color = colors[(startingColorIndex + colors.size - 1) % colors.size]
+
drawRect(
- Rect(
- startingPos + width + 10, 0f, startingPos + width * 2 - 10,
- size.height.value
- ), paint
+ colors[(startingColorIndex + colors.size - 1) % colors.size],
+ topLeft = Offset(startingPos + width + 10, 0f),
+ size = rectSize
)
- paint.color = colors[(startingColorIndex + colors.size - 2) % colors.size]
+
drawRect(
- Rect(
- startingPos + width * 2 + 10, 0f, startingPos + width * 3 - 10,
- size.height.value
- ), paint
+ colors[(startingColorIndex + colors.size - 2) % colors.size],
+ topLeft = Offset(startingPos + width * 2 + 10, 0.0f),
+ size = rectSize
)
}
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateAnimationWithInterruptionsDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateAnimationWithInterruptionsDemo.kt
index 380a227..a7313a0 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateAnimationWithInterruptionsDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateAnimationWithInterruptionsDemo.kt
@@ -27,11 +27,11 @@
import androidx.ui.animation.Transition
import androidx.ui.core.Modifier
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.drawBackground
-import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
import androidx.ui.layout.fillMaxSize
@Composable
@@ -96,15 +96,11 @@
private fun ColorRectState(state: TransitionState) {
val color = state[background]
val scaleY = state[y]
- Canvas(Modifier.fillMaxSize().drawBackground(color = color)) {
- val paint = Paint().apply {
- this.color = Color(alpha = 255, red = 255, green = 255, blue = 255)
- }
+ Canvas2(Modifier.fillMaxSize().drawBackground(color = color)) {
drawRect(
- Rect(
- 100f, 0f, size.width.value - 100f,
- scaleY * size.height.value
- ), paint
+ Color(alpha = 255, red = 255, green = 255, blue = 255),
+ topLeft = Offset(100f, 0f),
+ size = Size(size.width - 200f, scaleY * size.height)
)
}
}
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateBasedRippleDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateBasedRippleDemo.kt
index 5a65259..e6013b5 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateBasedRippleDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/StateBasedRippleDemo.kt
@@ -30,10 +30,9 @@
import androidx.ui.core.Modifier
import androidx.ui.core.gesture.pressIndicatorGestureFilter
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.geometry.Offset
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
import androidx.ui.layout.fillMaxSize
import androidx.ui.unit.PxPosition
import androidx.ui.unit.dp
@@ -69,23 +68,18 @@
@Composable
private fun RippleRectFromState(modifier: Modifier = Modifier, state: TransitionState) {
- Canvas(modifier.fillMaxSize()) {
+ Canvas2(modifier.fillMaxSize()) {
// TODO: file bug for when "down" is not a file level val, it's not memoized correctly
- val x = down.x
- val y = down.y
-
- val paint =
- Paint().apply {
- color = Color(
- alpha = (state[androidx.ui.animation.demos.alpha] * 255).toInt(),
- red = 0,
- green = 235,
- blue = 224
- )
- }
-
- val radius = state[radius]
- drawCircle(Offset(x, y), radius, paint)
+ drawCircle(
+ Color(
+ alpha = (state[alpha] * 255).toInt(),
+ red = 0,
+ green = 235,
+ blue = 224
+ ),
+ center = Offset(down.x, down.y),
+ radius = state[radius]
+ )
}
}
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt
index 545cacc..41ee964 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt
@@ -23,20 +23,19 @@
import androidx.animation.TargetAnimation
import androidx.animation.fling
import androidx.compose.Composable
-import androidx.compose.remember
import androidx.compose.state
import androidx.ui.animation.animatedFloat
import androidx.ui.core.DensityAmbient
-import androidx.ui.core.DrawScope
import androidx.ui.core.Modifier
import androidx.ui.core.gesture.DragObserver
import androidx.ui.core.gesture.rawDragGestureFilter
import androidx.ui.core.onPositioned
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.Text
-import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
+import androidx.ui.graphics.painter.CanvasScope
import androidx.ui.layout.Column
import androidx.ui.layout.fillMaxWidth
import androidx.ui.layout.padding
@@ -122,9 +121,8 @@
})
val heightDp = with(DensityAmbient.current) { height.toDp() }
- val paint = remember { Paint() }
- Canvas(
+ Canvas2(
modifier.fillMaxWidth()
.preferredHeight(heightDp)
.onPositioned { coordinates ->
@@ -135,64 +133,43 @@
// TODO: this progress can be used to drive state transitions
val alpha = 1f - FastOutSlowInEasing(progress)
val horizontalOffset = progress * itemWidth.value
- drawLeftItems(
- paint, horizontalOffset, itemWidth.value, itemHeight, index.value
- )
- drawDismissingItem(
- paint,
- itemBottom.value, itemWidth.value, itemHeight, index.value + 1,
- alpha
- )
+ drawLeftItems(horizontalOffset, itemWidth.value, itemHeight, index.value)
+ drawDismissingItem(itemBottom.value, itemWidth.value, itemHeight, index.value + 1, alpha)
}
}
-private fun DrawScope.drawLeftItems(
- paint: Paint,
+private fun CanvasScope.drawLeftItems(
horizontalOffset: Float,
width: Float,
height: Float,
index: Int
) {
- paint.color = colors[index % colors.size]
- paint.alpha = 1f
- val centerX = size.width.value / 2
- val itemRect =
- Rect(
- centerX - width * 1.5f + horizontalOffset + padding,
- size.height.value - height,
- centerX - width * 0.5f + horizontalOffset - padding,
- size.height.value
- )
- drawRect(itemRect, paint)
+ val offset = Offset(center.dx - width * 1.5f + horizontalOffset + padding, size.height - height)
+ val rectSize = Size(width - (2 * padding), height)
+ drawRect(colors[index % colors.size], offset, rectSize)
- if (itemRect.left >= 0) {
+ if (offset.dx >= 0) {
// draw another item
- paint.color = colors[(index - 1 + colors.size) % colors.size]
- drawRect(itemRect.translate(-width, 0f), paint)
+ drawRect(
+ colors[(index - 1 + colors.size) % colors.size],
+ offset - Offset(width, 0.0f),
+ rectSize
+ )
}
}
-private fun DrawScope.drawDismissingItem(
- paint: Paint,
+private fun CanvasScope.drawDismissingItem(
bottom: Float,
width: Float,
height: Float,
index: Int,
alpha: Float
-) {
- paint.color = colors[index % colors.size]
- paint.alpha = alpha
- val centerX = size.width.value / 2
- drawRect(
- Rect(
- centerX - width / 2 + padding,
- bottom - height,
- centerX + width / 2 - padding,
- bottom
- ),
- paint
+) = drawRect(
+ colors[index % colors.size],
+ topLeft = Offset(center.dx - width / 2 + padding, bottom - height),
+ size = Size(width - (2 * padding), height),
+ alpha = alpha
)
-}
private val colors = listOf(
Color(0xFFffd7d7),
diff --git a/ui/ui-animation/src/androidTest/java/androidx/ui/animation/CrossfadeTest.kt b/ui/ui-animation/src/androidTest/java/androidx/ui/animation/CrossfadeTest.kt
new file mode 100644
index 0000000..d008d05
--- /dev/null
+++ b/ui/ui-animation/src/androidTest/java/androidx/ui/animation/CrossfadeTest.kt
@@ -0,0 +1,129 @@
+/*
+ * 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.ui.animation
+
+import androidx.animation.DefaultDuration
+import androidx.animation.TweenBuilder
+import androidx.compose.getValue
+import androidx.compose.mutableStateOf
+import androidx.compose.onDispose
+import androidx.compose.setValue
+import androidx.compose.state
+import androidx.test.filters.MediumTest
+import androidx.ui.foundation.Text
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.findByText
+import androidx.ui.test.runOnIdleCompose
+import androidx.ui.test.waitForIdle
+import org.junit.Assert.assertTrue
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+@RunWith(JUnit4::class)
+@MediumTest
+class CrossfadeTest {
+
+ @get:Rule
+ val composeTestRule = createComposeRule(disableTransitions = false)
+
+ @Test
+ fun crossfadeTest_showsContent() {
+ composeTestRule.clockTestRule.pauseClock()
+
+ composeTestRule.setContent {
+ val showFirst by state { true }
+ Crossfade(showFirst) {
+ Text(if (it) First else Second)
+ }
+ }
+ composeTestRule.clockTestRule.advanceClock(DefaultDuration.toLong())
+
+ findByText(First).assertExists()
+ }
+
+ @Test
+ fun crossfadeTest_disposesContentOnChange() {
+ composeTestRule.clockTestRule.pauseClock()
+
+ var showFirst by mutableStateOf(true)
+ var disposed = false
+ composeTestRule.setContent {
+ Crossfade(showFirst) {
+ Text(if (it) First else Second)
+ onDispose {
+ disposed = true
+ }
+ }
+ }
+ composeTestRule.clockTestRule.advanceClock(DefaultDuration.toLong())
+
+ runOnIdleCompose {
+ showFirst = false
+ }
+
+ waitForIdle()
+
+ composeTestRule.clockTestRule.advanceClock(DefaultDuration.toLong())
+
+ runOnIdleCompose {
+ assertTrue(disposed)
+ }
+
+ findByText(First).assertDoesNotExist()
+ findByText(Second).assertExists()
+ }
+
+ @Test
+ fun crossfadeTest_durationCanBeModifierUsingAnimationBuilder() {
+ composeTestRule.clockTestRule.pauseClock()
+
+ val duration = 100L // smaller than default 300
+ var showFirst by mutableStateOf(true)
+ var disposed = false
+ composeTestRule.setContent {
+ Crossfade(showFirst, TweenBuilder<Float>().apply {
+ this.duration = duration.toInt()
+ }) {
+ Text(if (it) First else Second)
+ onDispose {
+ disposed = true
+ }
+ }
+ }
+ composeTestRule.clockTestRule.advanceClock(duration)
+
+ runOnIdleCompose {
+ showFirst = false
+ }
+
+ waitForIdle()
+
+ composeTestRule.clockTestRule.advanceClock(duration)
+
+ runOnIdleCompose {
+ assertTrue(disposed)
+ }
+ }
+
+ companion object {
+ private const val First = "first"
+ private const val Second = "second"
+ }
+}
diff --git a/ui/ui-animation/src/androidTest/java/androidx/ui/animation/CrossfadeUiTest.kt b/ui/ui-animation/src/androidTest/java/androidx/ui/animation/CrossfadeUiTest.kt
deleted file mode 100644
index 950e2bf..0000000
--- a/ui/ui-animation/src/androidTest/java/androidx/ui/animation/CrossfadeUiTest.kt
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * 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.ui.animation
-
-import androidx.compose.getValue
-import androidx.compose.mutableStateOf
-import androidx.compose.onDispose
-import androidx.compose.setValue
-import androidx.compose.state
-import androidx.test.filters.MediumTest
-import androidx.ui.foundation.Text
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.findByText
-import androidx.ui.test.runOnIdleCompose
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-
-@RunWith(JUnit4::class)
-@MediumTest
-class CrossfadeUiTest {
-
- @get:Rule
- val composeTestRule = createComposeRule(disableTransitions = false)
-
- @Test
- fun crossfadeTest_showsContent() {
- composeTestRule.setContent {
- var showFirst by state { true }
- Crossfade(showFirst) {
- Text(if (it) First else Second)
- }
- }
- composeTestRule.clockTestRule.advanceClock(300)
-
- findByText(First).assertExists()
- }
-
- @Test
- fun crossfadeTest_disposesContentOnChange() {
- var showFirst by mutableStateOf(true)
- val disposeLatch = CountDownLatch(1)
- composeTestRule.setContent {
-
- Crossfade(showFirst) {
- Text(if (it) First else Second)
- onDispose {
- disposeLatch.countDown()
- }
- }
- }
- composeTestRule.clockTestRule.advanceClock(300)
-
- runOnIdleCompose {
- showFirst = false
- }
- composeTestRule.clockTestRule.advanceClock(300)
-
- disposeLatch.await(5, TimeUnit.SECONDS)
-
- findByText(First).assertDoesNotExist()
- findByText(Second).assertExists()
- }
-
- companion object {
- private const val First = "first"
- private const val Second = "second"
- }
-}
\ No newline at end of file
diff --git a/ui/ui-animation/src/main/java/androidx/ui/animation/Crossfade.kt b/ui/ui-animation/src/main/java/androidx/ui/animation/Crossfade.kt
index fa97385..91ab535 100644
--- a/ui/ui-animation/src/main/java/androidx/ui/animation/Crossfade.kt
+++ b/ui/ui-animation/src/main/java/androidx/ui/animation/Crossfade.kt
@@ -17,6 +17,7 @@
package androidx.ui.animation
import androidx.animation.AnimatedFloat
+import androidx.animation.AnimationBuilder
import androidx.animation.AnimationEndReason
import androidx.animation.TweenBuilder
import androidx.compose.Composable
@@ -36,9 +37,14 @@
* @param current is a key representing your current layout state. every time you change a key
* the animation will be triggered. The [children] called with the old key will be faded out while
* the [children] called with the new key will be faded in.
+ * @param animation the [AnimationBuilder] to configure the animation.
*/
@Composable
-fun <T> Crossfade(current: T, children: @Composable() (T) -> Unit) {
+fun <T> Crossfade(
+ current: T,
+ animation: AnimationBuilder<Float> = TweenBuilder(),
+ children: @Composable() (T) -> Unit
+) {
val state = remember { CrossfadeState<T>() }
if (current != state.current) {
state.current = current
@@ -50,6 +56,7 @@
keys.mapTo(state.items) { key ->
CrossfadeAnimationItem(key) { children ->
val opacity = animatedOpacity(
+ animation = animation,
visible = key == current,
onAnimationFinish = {
if (key == state.current) {
@@ -92,6 +99,7 @@
@Composable
private fun animatedOpacity(
+ animation: AnimationBuilder<Float>,
visible: Boolean,
onAnimationFinish: () -> Unit = {}
): AnimatedFloat {
@@ -99,7 +107,7 @@
onCommit(visible) {
animatedFloat.animateTo(
if (visible) 1f else 0f,
- anim = TweenBuilder<Float>().apply { duration = 300 },
+ anim = animation,
onEnd = { reason, _ ->
if (reason == AnimationEndReason.TargetReached) {
onAnimationFinish()
diff --git a/ui/ui-foundation/api/0.1.0-dev11.txt b/ui/ui-foundation/api/0.1.0-dev11.txt
index 59f0deb..d9aca26 100644
--- a/ui/ui-foundation/api/0.1.0-dev11.txt
+++ b/ui/ui-foundation/api/0.1.0-dev11.txt
@@ -25,7 +25,8 @@
}
public final class CanvasKt {
- method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method @Deprecated public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method public static void Canvas2(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
}
public final class ClickableKt {
@@ -36,11 +37,6 @@
method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
}
- public final class ColoredRectKt {
- method @Deprecated public static void ColoredRect-HawTZqg(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- method @Deprecated public static void ColoredRect-rR94L9Y(long color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- }
-
public final class ContentColorKt {
method public static long contentColor();
method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
@@ -84,19 +80,6 @@
method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
}
- public final class DrawBordersReceiver {
- method public void all(androidx.ui.foundation.Border border = defaultBorder);
- method public void allHorizontal(androidx.ui.foundation.Border border = defaultBorder);
- method public void allVertical(androidx.ui.foundation.Border border = defaultBorder);
- method public void bottom(androidx.ui.foundation.Border border = defaultBorder);
- method public void horizontal(int row, kotlin.ranges.IntRange columns = 0 <other> columnCount, androidx.ui.foundation.Border border = defaultBorder);
- method public void left(androidx.ui.foundation.Border border = defaultBorder);
- method public void outer(androidx.ui.foundation.Border border = defaultBorder);
- method public void right(androidx.ui.foundation.Border border = defaultBorder);
- method public void top(androidx.ui.foundation.Border border = defaultBorder);
- method public void vertical(int column, kotlin.ranges.IntRange rows = 0 <other> rowCount, androidx.ui.foundation.Border border = defaultBorder);
- }
-
public final class IconKt {
method public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
method public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -164,10 +147,6 @@
field public static final androidx.ui.foundation.Strings! INSTANCE;
}
- public final class TableBordersKt {
- method public static void drawBorders(androidx.ui.layout.TableChildren, androidx.ui.foundation.Border defaultBorder = Border(Color.Black, Dp.Hairline), kotlin.jvm.functions.Function1<? super androidx.ui.foundation.DrawBordersReceiver,kotlin.Unit> block);
- }
-
public final class TextFieldKt {
method public static void TextField-4vuTNO4(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.input.FocusNode? focusNode = null, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long cursorColor = contentColor());
}
diff --git a/ui/ui-foundation/api/current.txt b/ui/ui-foundation/api/current.txt
index 59f0deb..d9aca26 100644
--- a/ui/ui-foundation/api/current.txt
+++ b/ui/ui-foundation/api/current.txt
@@ -25,7 +25,8 @@
}
public final class CanvasKt {
- method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method @Deprecated public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method public static void Canvas2(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
}
public final class ClickableKt {
@@ -36,11 +37,6 @@
method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
}
- public final class ColoredRectKt {
- method @Deprecated public static void ColoredRect-HawTZqg(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- method @Deprecated public static void ColoredRect-rR94L9Y(long color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- }
-
public final class ContentColorKt {
method public static long contentColor();
method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
@@ -84,19 +80,6 @@
method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
}
- public final class DrawBordersReceiver {
- method public void all(androidx.ui.foundation.Border border = defaultBorder);
- method public void allHorizontal(androidx.ui.foundation.Border border = defaultBorder);
- method public void allVertical(androidx.ui.foundation.Border border = defaultBorder);
- method public void bottom(androidx.ui.foundation.Border border = defaultBorder);
- method public void horizontal(int row, kotlin.ranges.IntRange columns = 0 <other> columnCount, androidx.ui.foundation.Border border = defaultBorder);
- method public void left(androidx.ui.foundation.Border border = defaultBorder);
- method public void outer(androidx.ui.foundation.Border border = defaultBorder);
- method public void right(androidx.ui.foundation.Border border = defaultBorder);
- method public void top(androidx.ui.foundation.Border border = defaultBorder);
- method public void vertical(int column, kotlin.ranges.IntRange rows = 0 <other> rowCount, androidx.ui.foundation.Border border = defaultBorder);
- }
-
public final class IconKt {
method public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
method public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -164,10 +147,6 @@
field public static final androidx.ui.foundation.Strings! INSTANCE;
}
- public final class TableBordersKt {
- method public static void drawBorders(androidx.ui.layout.TableChildren, androidx.ui.foundation.Border defaultBorder = Border(Color.Black, Dp.Hairline), kotlin.jvm.functions.Function1<? super androidx.ui.foundation.DrawBordersReceiver,kotlin.Unit> block);
- }
-
public final class TextFieldKt {
method public static void TextField-4vuTNO4(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.input.FocusNode? focusNode = null, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long cursorColor = contentColor());
}
diff --git a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev11.txt b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev11.txt
index 59f0deb..d9aca26 100644
--- a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev11.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev11.txt
@@ -25,7 +25,8 @@
}
public final class CanvasKt {
- method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method @Deprecated public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method public static void Canvas2(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
}
public final class ClickableKt {
@@ -36,11 +37,6 @@
method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
}
- public final class ColoredRectKt {
- method @Deprecated public static void ColoredRect-HawTZqg(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- method @Deprecated public static void ColoredRect-rR94L9Y(long color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- }
-
public final class ContentColorKt {
method public static long contentColor();
method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
@@ -84,19 +80,6 @@
method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
}
- public final class DrawBordersReceiver {
- method public void all(androidx.ui.foundation.Border border = defaultBorder);
- method public void allHorizontal(androidx.ui.foundation.Border border = defaultBorder);
- method public void allVertical(androidx.ui.foundation.Border border = defaultBorder);
- method public void bottom(androidx.ui.foundation.Border border = defaultBorder);
- method public void horizontal(int row, kotlin.ranges.IntRange columns = 0 <other> columnCount, androidx.ui.foundation.Border border = defaultBorder);
- method public void left(androidx.ui.foundation.Border border = defaultBorder);
- method public void outer(androidx.ui.foundation.Border border = defaultBorder);
- method public void right(androidx.ui.foundation.Border border = defaultBorder);
- method public void top(androidx.ui.foundation.Border border = defaultBorder);
- method public void vertical(int column, kotlin.ranges.IntRange rows = 0 <other> rowCount, androidx.ui.foundation.Border border = defaultBorder);
- }
-
public final class IconKt {
method public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
method public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -164,10 +147,6 @@
field public static final androidx.ui.foundation.Strings! INSTANCE;
}
- public final class TableBordersKt {
- method public static void drawBorders(androidx.ui.layout.TableChildren, androidx.ui.foundation.Border defaultBorder = Border(Color.Black, Dp.Hairline), kotlin.jvm.functions.Function1<? super androidx.ui.foundation.DrawBordersReceiver,kotlin.Unit> block);
- }
-
public final class TextFieldKt {
method public static void TextField-4vuTNO4(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.input.FocusNode? focusNode = null, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long cursorColor = contentColor());
}
diff --git a/ui/ui-foundation/api/public_plus_experimental_current.txt b/ui/ui-foundation/api/public_plus_experimental_current.txt
index 59f0deb..d9aca26 100644
--- a/ui/ui-foundation/api/public_plus_experimental_current.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_current.txt
@@ -25,7 +25,8 @@
}
public final class CanvasKt {
- method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method @Deprecated public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method public static void Canvas2(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
}
public final class ClickableKt {
@@ -36,11 +37,6 @@
method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
}
- public final class ColoredRectKt {
- method @Deprecated public static void ColoredRect-HawTZqg(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- method @Deprecated public static void ColoredRect-rR94L9Y(long color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- }
-
public final class ContentColorKt {
method public static long contentColor();
method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
@@ -84,19 +80,6 @@
method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
}
- public final class DrawBordersReceiver {
- method public void all(androidx.ui.foundation.Border border = defaultBorder);
- method public void allHorizontal(androidx.ui.foundation.Border border = defaultBorder);
- method public void allVertical(androidx.ui.foundation.Border border = defaultBorder);
- method public void bottom(androidx.ui.foundation.Border border = defaultBorder);
- method public void horizontal(int row, kotlin.ranges.IntRange columns = 0 <other> columnCount, androidx.ui.foundation.Border border = defaultBorder);
- method public void left(androidx.ui.foundation.Border border = defaultBorder);
- method public void outer(androidx.ui.foundation.Border border = defaultBorder);
- method public void right(androidx.ui.foundation.Border border = defaultBorder);
- method public void top(androidx.ui.foundation.Border border = defaultBorder);
- method public void vertical(int column, kotlin.ranges.IntRange rows = 0 <other> rowCount, androidx.ui.foundation.Border border = defaultBorder);
- }
-
public final class IconKt {
method public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
method public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -164,10 +147,6 @@
field public static final androidx.ui.foundation.Strings! INSTANCE;
}
- public final class TableBordersKt {
- method public static void drawBorders(androidx.ui.layout.TableChildren, androidx.ui.foundation.Border defaultBorder = Border(Color.Black, Dp.Hairline), kotlin.jvm.functions.Function1<? super androidx.ui.foundation.DrawBordersReceiver,kotlin.Unit> block);
- }
-
public final class TextFieldKt {
method public static void TextField-4vuTNO4(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.input.FocusNode? focusNode = null, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long cursorColor = contentColor());
}
diff --git a/ui/ui-foundation/api/restricted_0.1.0-dev11.txt b/ui/ui-foundation/api/restricted_0.1.0-dev11.txt
index 59f0deb..d9aca26 100644
--- a/ui/ui-foundation/api/restricted_0.1.0-dev11.txt
+++ b/ui/ui-foundation/api/restricted_0.1.0-dev11.txt
@@ -25,7 +25,8 @@
}
public final class CanvasKt {
- method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method @Deprecated public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method public static void Canvas2(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
}
public final class ClickableKt {
@@ -36,11 +37,6 @@
method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
}
- public final class ColoredRectKt {
- method @Deprecated public static void ColoredRect-HawTZqg(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- method @Deprecated public static void ColoredRect-rR94L9Y(long color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- }
-
public final class ContentColorKt {
method public static long contentColor();
method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
@@ -84,19 +80,6 @@
method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
}
- public final class DrawBordersReceiver {
- method public void all(androidx.ui.foundation.Border border = defaultBorder);
- method public void allHorizontal(androidx.ui.foundation.Border border = defaultBorder);
- method public void allVertical(androidx.ui.foundation.Border border = defaultBorder);
- method public void bottom(androidx.ui.foundation.Border border = defaultBorder);
- method public void horizontal(int row, kotlin.ranges.IntRange columns = 0 <other> columnCount, androidx.ui.foundation.Border border = defaultBorder);
- method public void left(androidx.ui.foundation.Border border = defaultBorder);
- method public void outer(androidx.ui.foundation.Border border = defaultBorder);
- method public void right(androidx.ui.foundation.Border border = defaultBorder);
- method public void top(androidx.ui.foundation.Border border = defaultBorder);
- method public void vertical(int column, kotlin.ranges.IntRange rows = 0 <other> rowCount, androidx.ui.foundation.Border border = defaultBorder);
- }
-
public final class IconKt {
method public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
method public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -164,10 +147,6 @@
field public static final androidx.ui.foundation.Strings! INSTANCE;
}
- public final class TableBordersKt {
- method public static void drawBorders(androidx.ui.layout.TableChildren, androidx.ui.foundation.Border defaultBorder = Border(Color.Black, Dp.Hairline), kotlin.jvm.functions.Function1<? super androidx.ui.foundation.DrawBordersReceiver,kotlin.Unit> block);
- }
-
public final class TextFieldKt {
method public static void TextField-4vuTNO4(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.input.FocusNode? focusNode = null, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long cursorColor = contentColor());
}
diff --git a/ui/ui-foundation/api/restricted_current.txt b/ui/ui-foundation/api/restricted_current.txt
index 59f0deb..d9aca26 100644
--- a/ui/ui-foundation/api/restricted_current.txt
+++ b/ui/ui-foundation/api/restricted_current.txt
@@ -25,7 +25,8 @@
}
public final class CanvasKt {
- method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method @Deprecated public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+ method public static void Canvas2(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
}
public final class ClickableKt {
@@ -36,11 +37,6 @@
method public static void ClickableText(androidx.ui.text.AnnotatedString text, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.text.TextStyle style = TextStyle.Default, boolean softWrap = true, androidx.ui.text.style.TextOverflow overflow = TextOverflow.Clip, int maxLines = 2147483647, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super java.lang.Integer,kotlin.Unit> onClick);
}
- public final class ColoredRectKt {
- method @Deprecated public static void ColoredRect-HawTZqg(androidx.ui.graphics.Brush brush, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- method @Deprecated public static void ColoredRect-rR94L9Y(long color, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null);
- }
-
public final class ContentColorKt {
method public static long contentColor();
method public static androidx.compose.ProvidableAmbient<androidx.ui.graphics.Color> getContentColorAmbient();
@@ -84,19 +80,6 @@
method public static androidx.ui.core.Modifier drawBorder-vGsXmEw(androidx.ui.core.Modifier, float size, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape);
}
- public final class DrawBordersReceiver {
- method public void all(androidx.ui.foundation.Border border = defaultBorder);
- method public void allHorizontal(androidx.ui.foundation.Border border = defaultBorder);
- method public void allVertical(androidx.ui.foundation.Border border = defaultBorder);
- method public void bottom(androidx.ui.foundation.Border border = defaultBorder);
- method public void horizontal(int row, kotlin.ranges.IntRange columns = 0 <other> columnCount, androidx.ui.foundation.Border border = defaultBorder);
- method public void left(androidx.ui.foundation.Border border = defaultBorder);
- method public void outer(androidx.ui.foundation.Border border = defaultBorder);
- method public void right(androidx.ui.foundation.Border border = defaultBorder);
- method public void top(androidx.ui.foundation.Border border = defaultBorder);
- method public void vertical(int column, kotlin.ranges.IntRange rows = 0 <other> rowCount, androidx.ui.foundation.Border border = defaultBorder);
- }
-
public final class IconKt {
method public static void Icon-A4lfJGc(androidx.ui.graphics.vector.VectorAsset asset, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
method public static void Icon-RCipKA8(androidx.ui.graphics.painter.Painter painter, androidx.ui.core.Modifier modifier = Modifier, long tint = contentColor());
@@ -164,10 +147,6 @@
field public static final androidx.ui.foundation.Strings! INSTANCE;
}
- public final class TableBordersKt {
- method public static void drawBorders(androidx.ui.layout.TableChildren, androidx.ui.foundation.Border defaultBorder = Border(Color.Black, Dp.Hairline), kotlin.jvm.functions.Function1<? super androidx.ui.foundation.DrawBordersReceiver,kotlin.Unit> block);
- }
-
public final class TextFieldKt {
method public static void TextField-4vuTNO4(androidx.ui.foundation.TextFieldValue value, kotlin.jvm.functions.Function1<? super androidx.ui.foundation.TextFieldValue,kotlin.Unit> onValueChange, androidx.ui.core.Modifier modifier = Modifier, androidx.ui.core.input.FocusNode? focusNode = null, long textColor = Color.Unset, androidx.ui.text.TextStyle textStyle = currentTextStyle(), androidx.ui.input.KeyboardType keyboardType = KeyboardType.Text, androidx.ui.input.ImeAction imeAction = ImeAction.Unspecified, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onFocusChange = {}, kotlin.jvm.functions.Function1<? super androidx.ui.input.ImeAction,kotlin.Unit> onImeActionPerformed = {}, androidx.ui.input.VisualTransformation? visualTransformation = null, kotlin.jvm.functions.Function1<? super androidx.ui.text.TextLayoutResult,kotlin.Unit> onTextLayout = {}, kotlin.jvm.functions.Function1<? super androidx.ui.text.SoftwareKeyboardController,kotlin.Unit> onTextInputStarted = {}, long cursorColor = contentColor());
}
diff --git a/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/ui/foundation/demos/FoundationDemos.kt b/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/ui/foundation/demos/FoundationDemos.kt
index 07791013..5112247 100644
--- a/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/ui/foundation/demos/FoundationDemos.kt
+++ b/ui/ui-foundation/integration-tests/foundation-demos/src/main/java/androidx/ui/foundation/demos/FoundationDemos.kt
@@ -21,14 +21,12 @@
import androidx.ui.foundation.samples.ControlledHorizontalScrollerSample
import androidx.ui.foundation.samples.DialogSample
import androidx.ui.foundation.samples.InteractionStateSample
-import androidx.ui.foundation.samples.TableWithBorders
import androidx.ui.foundation.samples.VerticalScrollerSample
val FoundationDemos = DemoCategory("Foundation", listOf(
ComposableDemo("Draggable and Scrollable") { HighLevelGesturesDemo() },
ComposableDemo("VerticalScroller") { VerticalScrollerSample() },
ComposableDemo("HorizontalScroller") { ControlledHorizontalScrollerSample() },
- ComposableDemo("TableBorders") { TableWithBorders() },
ComposableDemo("Dialog") { DialogSample() },
ComposableDemo("Draw Modifiers") { DrawModifiersDemo() },
ComposableDemo("Boxes") { BoxDemo() },
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/CanvasSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/CanvasSamples.kt
index cd44ebc..b1cd6e5 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/CanvasSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/CanvasSamples.kt
@@ -21,17 +21,44 @@
import androidx.compose.remember
import androidx.ui.core.Modifier
import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
+import androidx.ui.geometry.Offset
import androidx.ui.graphics.Color
import androidx.ui.graphics.Paint
+import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.Stroke
+import androidx.ui.graphics.painter.inset
import androidx.ui.layout.preferredSize
import androidx.ui.unit.dp
import androidx.ui.unit.toRect
@Sampled
@Composable
+@Suppress("DEPRECATION")
+@Deprecated("Prefer usage of Canvas2", ReplaceWith("Canvas2Sample"))
fun CanvasSample() {
val paint = remember { Paint().apply { color = Color.Magenta } }
Canvas(modifier = Modifier.preferredSize(100.dp)) {
drawRect(size.toRect(), paint)
}
-}
\ No newline at end of file
+}
+
+/**
+ * Sample showing how to create a composable that supports issuing
+ * drawing commands through a [CanvasScope]
+ */
+@Sampled
+@Composable
+fun Canvas2Sample() {
+ Canvas2(modifier = Modifier.preferredSize(20.dp)) {
+ drawRect(color = Color.White)
+ inset(10.0f) {
+ drawLine(
+ p1 = Offset.zero,
+ p2 = Offset(size.width, size.height),
+ stroke = Stroke(width = 5.0f),
+ color = Color.Red
+ )
+ }
+ }
+}
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ImageSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ImageSamples.kt
index c61b749..9d1e31a 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ImageSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ImageSamples.kt
@@ -22,15 +22,16 @@
import androidx.ui.core.Modifier
import androidx.ui.foundation.Image
import androidx.ui.geometry.Offset
-import androidx.ui.geometry.Rect
import androidx.ui.graphics.Canvas
import androidx.ui.graphics.Color
import androidx.ui.graphics.ColorFilter
import androidx.ui.graphics.ImageAsset
import androidx.ui.graphics.Paint
import androidx.ui.core.ContentScale
+import androidx.ui.geometry.Size
import androidx.ui.graphics.painter.ImagePainter
import androidx.ui.graphics.painter.Painter
+import androidx.ui.graphics.painter.CanvasScope
import androidx.ui.layout.preferredSize
import androidx.ui.res.loadVectorResource
import androidx.ui.unit.PxSize
@@ -51,7 +52,11 @@
val imageAsset = createTestImage()
// Lays out and draws an image sized to the rectangular subsection of the ImageAsset
Image(
- painter = ImagePainter(imageAsset, Rect.fromLTWH(10.0f, 12.0f, 50.0f, 60.0f))
+ painter = ImagePainter(
+ imageAsset,
+ Offset(10.0f, 12.0f),
+ Size(50.0f, 60.0f)
+ )
)
}
@@ -75,16 +80,11 @@
val customPainter = remember {
object : Painter() {
- val paint = Paint().apply { this.color = Color.Cyan }
-
override val intrinsicSize: PxSize
get() = PxSize(100.px, 100.px)
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
- canvas.drawRect(
- Rect.fromLTWH(0.0f, 0.0f, bounds.width.value, bounds.height.value),
- paint
- )
+ override fun CanvasScope.onDraw() {
+ drawRect(color = Color.Cyan)
}
}
}
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ScrollerSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ScrollerSamples.kt
index 1994e3d..5df2cab 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ScrollerSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ScrollerSamples.kt
@@ -20,7 +20,6 @@
import androidx.compose.Composable
import androidx.compose.MutableState
import androidx.compose.state
-import androidx.ui.core.Alignment
import androidx.ui.core.Modifier
import androidx.ui.core.gesture.pressIndicatorGestureFilter
import androidx.ui.foundation.Box
@@ -35,7 +34,6 @@
import androidx.ui.graphics.RectangleShape
import androidx.ui.layout.Column
import androidx.ui.layout.Row
-import androidx.ui.layout.Table
import androidx.ui.layout.padding
import androidx.ui.layout.preferredSize
import androidx.ui.text.TextStyle
@@ -145,8 +143,8 @@
@Composable
private fun ScrollControl(position: ScrollerPosition, scrollable: MutableState<Boolean>) {
- Table(3, alignment = { Alignment.Center }) {
- tableRow {
+ Column {
+ Row {
Text("Scroll")
SquareButton("< -", Color.Red) {
position.scrollTo(position.value - 1000)
@@ -155,7 +153,7 @@
position.scrollBy(10000f)
}
}
- tableRow {
+ Row {
Text("Smooth Scroll")
SquareButton("< -", Color.Red) {
position.smoothScrollTo(position.value - 1000)
@@ -164,13 +162,10 @@
position.smoothScrollBy(10000f)
}
}
- tableRow {
+ Row {
SquareButton("Scroll: ${scrollable.value}") {
scrollable.value = !scrollable.value
}
- // empty dummy boxes to fill the table
- Box()
- Box()
}
}
}
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/TableBordersSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/TableBordersSamples.kt
deleted file mode 100644
index 9112cb5..0000000
--- a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/TableBordersSamples.kt
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2019 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.ui.foundation.samples
-
-import androidx.annotation.Sampled
-import androidx.compose.Composable
-import androidx.ui.core.Modifier
-import androidx.ui.foundation.Border
-import androidx.ui.foundation.Box
-import androidx.ui.foundation.drawBorders
-import androidx.ui.graphics.Color
-import androidx.ui.layout.Table
-import androidx.ui.layout.aspectRatio
-import androidx.ui.layout.fillMaxSize
-import androidx.ui.layout.padding
-import androidx.ui.unit.dp
-
-@Sampled
-@Composable
-fun TableWithBorders() {
- Table(columns = 8) {
- drawBorders(
- defaultBorder = Border(color = Color.Red, size = 2.dp)
- ) {
- outer()
- vertical(column = 2, rows = 0 until 8)
- vertical(column = 4, rows = 0 until 8)
- vertical(column = 6, rows = 0 until 8)
- horizontal(row = 2, columns = 0 until 8)
- horizontal(row = 4, columns = 0 until 8)
- horizontal(row = 6, columns = 0 until 8)
- }
- repeat(8) {
- tableRow {
- repeat(8) {
- Box(
- Modifier.padding(2.dp).aspectRatio(1f).fillMaxSize(),
- backgroundColor = Color.Magenta
- )
- }
- }
- }
- }
-}
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/Canvas2Test.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/Canvas2Test.kt
new file mode 100644
index 0000000..e3738cb
--- /dev/null
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/Canvas2Test.kt
@@ -0,0 +1,233 @@
+/*
+ * 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.ui.foundation
+
+import android.os.Build
+import androidx.compose.Composable
+import androidx.test.filters.SdkSuppress
+import androidx.test.filters.LargeTest
+import androidx.ui.core.Alignment
+import androidx.ui.core.DensityAmbient
+import androidx.ui.core.Modifier
+import androidx.ui.core.TestTag
+import androidx.ui.core.onPositioned
+import androidx.ui.foundation.shape.corner.CircleShape
+import androidx.ui.geometry.Offset
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.RectangleShape
+import androidx.ui.graphics.painter.Stroke
+import androidx.ui.graphics.toArgb
+import androidx.ui.layout.Stack
+import androidx.ui.layout.preferredSize
+import androidx.ui.layout.wrapContentSize
+import androidx.ui.semantics.Semantics
+import androidx.ui.test.assertShape
+import androidx.ui.test.captureToBitmap
+import androidx.ui.test.createComposeRule
+import androidx.ui.test.findByTag
+import androidx.ui.test.setContentAndCollectSizes
+import androidx.ui.unit.Density
+import androidx.ui.unit.IntPxSize
+import androidx.ui.unit.dp
+import androidx.ui.unit.px
+import com.google.common.truth.Truth
+import org.junit.Assert
+import org.junit.Assert.assertTrue
+import org.junit.Rule
+import org.junit.Test
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+@LargeTest
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+class Canvas2Test {
+
+ val contentTag = "Canvas2Test"
+ val boxWidth = 100
+ val boxHeight = 100
+ val containerSize = boxWidth
+
+ @get:Rule
+ val composeTestRule = createComposeRule()
+
+ @Test
+ fun testCanvas2() {
+ val strokeWidth = 5.0f
+ composeTestRule.setContent {
+ val density = DensityAmbient.current.density
+ val containerSize = (containerSize * 2 / density).dp
+ val minWidth = (boxWidth / density).dp
+ val minHeight = (boxHeight / density).dp
+ Box(modifier = Modifier.preferredSize(containerSize)
+ .drawBackground(Color.White)
+ .wrapContentSize(Alignment.Center)) {
+ TestTag(contentTag) {
+ Canvas2(modifier = Modifier.preferredSize(minWidth, minHeight)) {
+ drawLine(
+ p1 = Offset.zero,
+ p2 = Offset(size.width, size.height),
+ color = Color.Red,
+ stroke = Stroke(width = strokeWidth)
+ )
+ }
+ }
+ }
+ }
+
+ val paintBoxColor = Color.Red.toArgb()
+ val containerBgColor = Color.White.toArgb()
+ val strokeOffset = (strokeWidth / 2).toInt() + 3
+ findByTag(contentTag).captureToBitmap().apply {
+ val imageStartX = width / 2 - boxWidth / 2
+ val imageStartY = height / 2 - boxHeight / 2
+
+ // Top left
+ Assert.assertEquals(paintBoxColor, getPixel(imageStartX, imageStartY))
+
+ // Top Left, to the left of the line
+ Assert.assertEquals(containerBgColor,
+ getPixel(imageStartX - strokeOffset, imageStartY))
+
+ // Top Left, to the right of the line
+ Assert.assertEquals(containerBgColor,
+ getPixel(imageStartX + strokeOffset, imageStartY))
+
+ // Bottom right
+ Assert.assertEquals(paintBoxColor, getPixel(imageStartX + boxWidth - 1,
+ imageStartY + boxHeight - 1))
+
+ // Bottom right to the right of the line
+ Assert.assertEquals(containerBgColor,
+ getPixel(imageStartX + boxWidth + strokeOffset,
+ imageStartY + boxHeight))
+
+ // Bottom right to the left of the line
+ Assert.assertEquals(containerBgColor,
+ getPixel(imageStartX + boxWidth - strokeOffset,
+ imageStartY + boxHeight))
+
+ // Middle
+ Assert.assertEquals(paintBoxColor, getPixel(imageStartX + boxWidth / 2,
+ imageStartY + boxHeight / 2))
+
+ // Middle to the left of the line
+ Assert.assertEquals(containerBgColor,
+ getPixel(imageStartX + boxWidth / 2 - strokeOffset,
+ imageStartY + boxHeight / 2))
+
+ // Middle to the right of the line
+ Assert.assertEquals(containerBgColor,
+ getPixel(imageStartX + boxWidth / 2 + strokeOffset,
+ imageStartY + boxHeight / 2))
+ }
+ }
+
+ @Test
+ fun canvas2_noSize_emptyCanvas() {
+ composeTestRule.setContentAndCollectSizes {
+ Canvas2(modifier = Modifier) {
+ drawRect(Color.Black)
+ }
+ }
+ .assertHeightEqualsTo(0.dp)
+ .assertWidthEqualsTo(0.dp)
+ }
+
+ @Test
+ fun canvas2_exactSizes() {
+ var canvasSize: IntPxSize? = null
+ val latch = CountDownLatch(1)
+ composeTestRule.setContentAndCollectSizes {
+ SemanticParent {
+ Canvas2(
+ Modifier.preferredSize(100.dp)
+ .onPositioned { position -> canvasSize = position.size }
+ ) {
+ drawRect(Color.Red)
+
+ latch.countDown()
+ }
+ }
+ }
+
+ assertTrue(latch.await(5, TimeUnit.SECONDS))
+
+ with(composeTestRule.density) {
+ Truth.assertThat(canvasSize!!.width.value).isEqualTo(100.dp.toIntPx().value)
+ Truth.assertThat(canvasSize!!.height.value).isEqualTo(100.dp.toIntPx().value)
+ }
+
+ val bitmap = findByTag(contentTag).captureToBitmap()
+ bitmap.assertShape(
+ density = composeTestRule.density,
+ backgroundColor = Color.Red,
+ shapeColor = Color.Red,
+ shape = RectangleShape
+ )
+ }
+
+ @Test
+ fun canvas2_exactSizes_drawCircle() {
+ var canvasSize: IntPxSize? = null
+ val latch = CountDownLatch(1)
+ composeTestRule.setContentAndCollectSizes {
+ SemanticParent {
+ Canvas2(
+ Modifier.preferredSize(100.dp)
+ .onPositioned { position -> canvasSize = position.size }
+ ) {
+ drawRect(Color.Red)
+ drawCircle(
+ Color.Blue,
+ radius = 10.0f
+ )
+ latch.countDown()
+ }
+ }
+ }
+
+ assertTrue(latch.await(5, TimeUnit.SECONDS))
+
+ with(composeTestRule.density) {
+ Truth.assertThat(canvasSize!!.width.value).isEqualTo(100.dp.toIntPx().value)
+ Truth.assertThat(canvasSize!!.height.value).isEqualTo(100.dp.toIntPx().value)
+ }
+
+ val bitmap = findByTag(contentTag).captureToBitmap()
+ bitmap.assertShape(
+ density = composeTestRule.density,
+ backgroundColor = Color.Red,
+ shapeColor = Color.Blue,
+ shape = CircleShape,
+ shapeSizeX = 20.px,
+ shapeSizeY = 20.px,
+ shapeOverlapPixelCount = 2.px
+ )
+ }
+
+ @Composable
+ fun SemanticParent(children: @Composable Density.() -> Unit) {
+ Stack {
+ TestTag(tag = contentTag) {
+ Semantics(container = true) {
+ Box {
+ DensityAmbient.current.children()
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/CanvasTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/CanvasTest.kt
index 38f9028..0ff7679 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/CanvasTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/CanvasTest.kt
@@ -44,10 +44,13 @@
import androidx.ui.unit.toOffset
import androidx.ui.unit.toRect
import com.google.common.truth.Truth
+import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
@MediumTest
@SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@@ -60,6 +63,7 @@
val testTag = "CanvasParent"
@Test
+ @Suppress("DEPRECATION")
fun canvas_noSize_emptyCanvas() {
composeTestRule.setContentAndCollectSizes {
Canvas(modifier = Modifier) {
@@ -71,8 +75,10 @@
}
@Test
+ @Suppress("DEPRECATION")
fun canvas_exactSizes() {
var canvasSize: IntPxSize? = null
+ val latch = CountDownLatch(1)
composeTestRule.setContentAndCollectSizes {
SemanticParent {
Canvas(
@@ -80,10 +86,13 @@
.onPositioned { position -> canvasSize = position.size }
) {
drawRect(size.toRect(), Paint().apply { color = Color.Red })
+ latch.countDown()
}
}
}
+ assertTrue(latch.await(5, TimeUnit.SECONDS))
+
with(composeTestRule.density) {
Truth.assertThat(canvasSize!!.width.value).isEqualTo(100.dp.toIntPx().value)
Truth.assertThat(canvasSize!!.height.value).isEqualTo(100.dp.toIntPx().value)
@@ -99,8 +108,10 @@
}
@Test
+ @Suppress("DEPRECATION")
fun canvas_exactSizes_drawCircle() {
var canvasSize: IntPxSize? = null
+ val latch = CountDownLatch(1)
composeTestRule.setContentAndCollectSizes {
SemanticParent {
Canvas(
@@ -113,10 +124,13 @@
10f,
Paint().apply { color = Color.Blue }
)
+ latch.countDown()
}
}
}
+ assertTrue(latch.await(5, TimeUnit.SECONDS))
+
with(composeTestRule.density) {
Truth.assertThat(canvasSize!!.width.value).isEqualTo(100.dp.toIntPx().value)
Truth.assertThat(canvasSize!!.height.value).isEqualTo(100.dp.toIntPx().value)
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ColoredRectTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ColoredRectTest.kt
deleted file mode 100644
index 453e8d5..0000000
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ColoredRectTest.kt
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright 2019 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.ui.foundation
-
-import androidx.test.filters.MediumTest
-import androidx.ui.core.Modifier
-import androidx.ui.graphics.Color
-import androidx.ui.layout.DpConstraints
-import androidx.ui.layout.fillMaxSize
-import androidx.ui.layout.preferredSize
-import androidx.ui.test.createComposeRule
-import androidx.ui.test.setContentAndCollectSizes
-import androidx.ui.unit.dp
-import androidx.ui.unit.ipx
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@MediumTest
-@RunWith(JUnit4::class)
-class ColoredRectTest {
-
- @get:Rule
- val composeTestRule = createComposeRule()
-
- private val color = Color(0xFFFF0000)
-
- @Test
- fun coloredRect_fixedSizes() {
- val width = 40.dp
- val height = 71.dp
- composeTestRule
- .setContentAndCollectSizes {
- Box(Modifier.preferredSize(width, height).drawBackground(color))
- }
- .assertWidthEqualsTo(width)
- .assertHeightEqualsTo(height)
- }
-
- @Test
- fun coloredRect_expand_LimitedSizes() {
- val width = 40.dp
- val height = 71.dp
- composeTestRule
- .setContentAndCollectSizes(
- parentConstraints = DpConstraints.fixed(
- width,
- height
- )
- ) {
- Box(Modifier.fillMaxSize().drawBackground(color))
- }
- .assertWidthEqualsTo(width)
- .assertHeightEqualsTo(height)
- }
-
- @Test
- fun coloredRect_expand_WholeScreenSizes() {
- val dm = composeTestRule.displayMetrics
- composeTestRule
- .setContentAndCollectSizes {
- Box(Modifier.fillMaxSize().drawBackground(color))
- }
- .assertWidthEqualsTo { dm.widthPixels.ipx }
- .assertHeightEqualsTo { dm.heightPixels.ipx }
- }
-}
\ No newline at end of file
diff --git a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ImageTest.kt b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ImageTest.kt
index 6039589..1f63cc2 100644
--- a/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ImageTest.kt
+++ b/ui/ui-foundation/src/androidTest/java/androidx/ui/foundation/ImageTest.kt
@@ -33,6 +33,8 @@
import androidx.ui.core.ContentScale
import androidx.ui.graphics.painter.ImagePainter
import androidx.ui.core.drawBehind
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
import androidx.ui.graphics.toArgb
import androidx.ui.layout.preferredSize
import androidx.ui.layout.preferredSizeIn
@@ -138,12 +140,11 @@
TestTag(contentTag) {
Image(
ImagePainter(createImageAsset(),
- Rect.fromLTWH(
+ Offset(
imageWidth / 2.0f - subsectionWidth / 2.0f,
- imageHeight / 2.0f - subsectionHeight / 2.0f,
- subsectionWidth.toFloat(),
- subsectionHeight.toFloat()
- )
+ imageHeight / 2.0f - subsectionHeight / 2.0f
+ ),
+ Size(subsectionWidth.toFloat(), subsectionHeight.toFloat())
)
)
}
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt
index afca77d..542449b 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt
@@ -17,9 +17,11 @@
package androidx.ui.foundation
import androidx.compose.Composable
+import androidx.compose.remember
import androidx.ui.core.Modifier
import androidx.ui.core.DrawScope
import androidx.ui.core.drawBehind
+import androidx.ui.graphics.painter.CanvasScope
import androidx.ui.layout.ColumnScope
import androidx.ui.layout.Spacer
@@ -36,9 +38,33 @@
* called during draw stage, you have no access to composition scope, meaning that [Composable]
* function invocation inside it will result to runtime exception
*/
+@Deprecated("Favor usage of Canvas2 which leverages the CanvasScope API. CanvasScope" +
+ " introduces a stateless, declarative API surface without the requirement of maintaining" +
+ "a Paint object",
+ ReplaceWith("Canvas2"))
@Composable
fun Canvas(modifier: Modifier, onCanvas: DrawScope.() -> Unit) {
Spacer(
modifier.drawBehind(onCanvas)
)
+}
+
+/**
+ * Creates a composable that lays out and draws content within a [CanvasScope].
+ * The size of this [Canvas2] is purely dictated by the given modifier chain.
+ *
+ * @sample androidx.ui.foundation.samples.Canvas2Sample
+ *
+ * @param modifier Modifier used to adjust the layout algorithm or draw decoration content (ex.
+ * background)
+ * @param block Lambda callback invoked on the created [CanvasScope] to issue drawing commands
+ */
+@Composable
+fun Canvas2(modifier: Modifier, block: CanvasScope.() -> Unit) {
+ val canvasScope = remember { CanvasScope() }
+ Spacer(
+ modifier.drawBehind {
+ canvasScope.draw(this, size, block)
+ }
+ )
}
\ No newline at end of file
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
deleted file mode 100644
index ba0bc08..0000000
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/ColoredRect.kt
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2019 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.ui.foundation
-
-import androidx.compose.Composable
-import androidx.ui.core.Modifier
-import androidx.ui.graphics.Brush
-import androidx.ui.graphics.Color
-import androidx.ui.layout.fillMaxHeight
-import androidx.ui.layout.fillMaxWidth
-import androidx.ui.layout.preferredHeight
-import androidx.ui.layout.preferredWidth
-import androidx.ui.unit.Dp
-
-/**
- * Component that represents a rectangle painted with the specified [Brush].
- *
- * If width and/or height are not specified, this component will expand
- * to the corresponding max constraints received from the parent
- * if these are finite, or to the min constraints otherwise.
- * Note that even if width and height are specified, these will not be satisfied
- * if the component's incoming layout constraints do not allow that.
- *
- * @param brush brush to paint rect with
- * @param width width of this rect, by default it will match incoming layout constraints
- * @param height height of this rect, by default it will match incoming layout constraints
- */
-@Deprecated(
- "Use Box(Modifier.preferredSize(width, height).drawBackground(brush)) instead",
- replaceWith = ReplaceWith(
- "Box(modifier.preferredSize(width, height)\n.drawBackground(brush))",
- "androidx.ui.foundation.preferredSize",
- "androidx.ui.foundation.drawBackground"
- )
-)
-@Composable
-fun ColoredRect(
- brush: Brush,
- modifier: Modifier = Modifier,
- width: Dp? = null,
- height: Dp? = null
-) {
- val widthModifier =
- if (width != null) Modifier.preferredWidth(width) else Modifier.fillMaxWidth()
- val heightModifier =
- if (height != null) Modifier.preferredHeight(height) else Modifier.fillMaxHeight()
- Box(modifier + widthModifier + heightModifier + Modifier.drawBackground(brush))
-}
-
-/**
- * Component that represents a rectangle painted with a solid color.
- *
- * @param color color to paint rect with
- * @param width width of this rect, by default it will match parent's constraints
- * @param height height of this rect, by default it will match parent's constraints
- */
-@Deprecated(
- "Use Box(Modifier.preferredSize(width, height).drawBackground(color)) instead",
- replaceWith = ReplaceWith(
- "Box(modifier.preferredSize(width, height)\n.drawBackground(color))",
- "androidx.ui.foundation.preferredSize",
- "androidx.ui.foundation.drawBackground"
- )
-)
-@Composable
-fun ColoredRect(
- color: Color,
- modifier: Modifier = Modifier,
- width: Dp? = null,
- height: Dp? = null
-) {
- val widthModifier =
- if (width != null) Modifier.preferredWidth(width) else Modifier.fillMaxWidth()
- val heightModifier =
- if (height != null) Modifier.preferredHeight(height) else Modifier.fillMaxHeight()
- Box(modifier + widthModifier + heightModifier + Modifier.drawBackground(color))
-}
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt
index 1dbb37a..c5cc489 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt
@@ -201,7 +201,7 @@
canvas: Canvas,
paint: Paint
) {
- val fillWithBorder = borderSize * 2 >= rect.getShortestSide()
+ val fillWithBorder = borderSize * 2 >= rect.minDimension
paint.style = if (fillWithBorder) PaintingStyle.fill else PaintingStyle.stroke
val delta = if (fillWithBorder) 0f else borderSize / 2
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/TableBorders.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/TableBorders.kt
deleted file mode 100644
index 70a84ef..0000000
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/TableBorders.kt
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- * Copyright 2019 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.ui.foundation
-
-import androidx.compose.remember
-import androidx.ui.core.Draw
-import androidx.ui.geometry.Offset
-import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
-import androidx.ui.layout.Table
-import androidx.ui.layout.TableChildren
-import androidx.ui.unit.Dp
-
-/**
- * Adds border drawing for a [Table] layout, when placed inside the [TableChildren] block.
- *
- * Example usage:
- *
- * @sample androidx.ui.foundation.samples.TableWithBorders
- *
- * @param defaultBorder The default [Border] appearance to be used for borders that do not
- * specify a style.
- */
-// TODO (popam): this should be a modifier b/150276337
-fun TableChildren.drawBorders(
- defaultBorder: Border = Border(color = Color.Black, size = Dp.Hairline),
- block: DrawBordersReceiver.() -> Unit
-) {
- tableDecoration(overlay = true) {
- val paint = remember { Paint() }
- @Suppress("DEPRECATION") // remove when b/150276337 is fixed
- Draw { canvas, _ ->
- val borders = DrawBordersReceiver(
- rowCount = verticalOffsets.size - 1,
- columnCount = horizontalOffsets.size - 1,
- defaultBorder = defaultBorder
- ).also(block).borders
- for ((border, row, column, orientation) in borders) {
- val p1 = Offset(
- dx = horizontalOffsets[column].value.toFloat(),
- dy = verticalOffsets[row].value.toFloat()
- )
- val p2 = when (orientation) {
- BorderOrientation.Vertical -> p1.copy(
- dy = verticalOffsets[row + 1].value.toFloat()
- )
- BorderOrientation.Horizontal -> p1.copy(
- dx = horizontalOffsets[column + 1].value.toFloat()
- )
- }
- // TODO(calintat): Reset paint when that operation is available.
- border.brush.applyTo(paint)
- paint.strokeWidth = border.size.toPx().value
- canvas.drawLine(p1, p2, paint)
- }
- }
- }
-}
-
-/**
- * Collects information about the borders specified by [drawBorders]
- * when its body is executed with a [DrawBordersReceiver] instance as argument.
- */
-class DrawBordersReceiver internal constructor(
- private val rowCount: Int,
- private val columnCount: Int,
- private val defaultBorder: Border
-) {
- internal val borders = mutableListOf<BorderInfo>()
-
- /**
- * Add all borders.
- */
- fun all(border: Border = defaultBorder) {
- allVertical(border)
- allHorizontal(border)
- }
-
- /**
- * Add all outer borders.
- */
- fun outer(border: Border = defaultBorder) {
- left(border)
- top(border)
- right(border)
- bottom(border)
- }
-
- /**
- * Add a vertical border before the first column.
- */
- fun left(border: Border = defaultBorder) = vertical(column = 0, border = border)
-
- /**
- * Add a horizontal border before the first row.
- */
- fun top(border: Border = defaultBorder) = horizontal(row = 0, border = border)
-
- /**
- * Add a vertical border after the last column.
- */
- fun right(border: Border = defaultBorder) = vertical(column = columnCount, border = border)
-
- /**
- * Add a horizontal border after the last row.
- */
- fun bottom(border: Border = defaultBorder) = horizontal(row = rowCount, border = border)
-
- /**
- * Add all vertical borders.
- */
- fun allVertical(border: Border = defaultBorder) {
- for (column in 0..columnCount) {
- vertical(column, border = border)
- }
- }
-
- /**
- * Add all horizontal borders.
- */
- fun allHorizontal(border: Border = defaultBorder) {
- for (row in 0..rowCount) {
- horizontal(row, border = border)
- }
- }
-
- /**
- * Add a vertical border before [column] at the rows specified by [rows].
- */
- fun vertical(
- column: Int,
- rows: IntRange = 0 until rowCount,
- border: Border = defaultBorder
- ) {
- if (column in 0..columnCount && 0 <= rows.start && rows.endInclusive < rowCount) {
- for (row in rows) {
- borders += BorderInfo(
- border = border,
- row = row,
- column = column,
- orientation = BorderOrientation.Vertical
- )
- }
- }
- }
-
- /**
- * Add a horizontal border before [row] at the columns specified by [columns].
- */
- fun horizontal(
- row: Int,
- columns: IntRange = 0 until columnCount,
- border: Border = defaultBorder
- ) {
- if (row in 0..rowCount && 0 <= columns.start && columns.endInclusive < columnCount) {
- for (column in columns) {
- borders += BorderInfo(
- border = border,
- row = row,
- column = column,
- orientation = BorderOrientation.Horizontal
- )
- }
- }
- }
-}
-
-internal data class BorderInfo(
- val border: Border,
- val row: Int,
- val column: Int,
- val orientation: BorderOrientation
-)
-
-internal enum class BorderOrientation { Vertical, Horizontal }
diff --git a/ui/ui-framework/api/0.1.0-dev11.txt b/ui/ui-framework/api/0.1.0-dev11.txt
index d4aa961..928f12f0 100644
--- a/ui/ui-framework/api/0.1.0-dev11.txt
+++ b/ui/ui-framework/api/0.1.0-dev11.txt
@@ -412,7 +412,7 @@
public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
diff --git a/ui/ui-framework/api/current.txt b/ui/ui-framework/api/current.txt
index d4aa961..928f12f0 100644
--- a/ui/ui-framework/api/current.txt
+++ b/ui/ui-framework/api/current.txt
@@ -412,7 +412,7 @@
public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
diff --git a/ui/ui-framework/api/public_plus_experimental_0.1.0-dev11.txt b/ui/ui-framework/api/public_plus_experimental_0.1.0-dev11.txt
index d4aa961..928f12f0 100644
--- a/ui/ui-framework/api/public_plus_experimental_0.1.0-dev11.txt
+++ b/ui/ui-framework/api/public_plus_experimental_0.1.0-dev11.txt
@@ -412,7 +412,7 @@
public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
diff --git a/ui/ui-framework/api/public_plus_experimental_current.txt b/ui/ui-framework/api/public_plus_experimental_current.txt
index d4aa961..928f12f0 100644
--- a/ui/ui-framework/api/public_plus_experimental_current.txt
+++ b/ui/ui-framework/api/public_plus_experimental_current.txt
@@ -412,7 +412,7 @@
public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
diff --git a/ui/ui-framework/api/restricted_0.1.0-dev11.txt b/ui/ui-framework/api/restricted_0.1.0-dev11.txt
index 8c99acf..0463c2c 100644
--- a/ui/ui-framework/api/restricted_0.1.0-dev11.txt
+++ b/ui/ui-framework/api/restricted_0.1.0-dev11.txt
@@ -412,7 +412,7 @@
public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
diff --git a/ui/ui-framework/api/restricted_current.txt b/ui/ui-framework/api/restricted_current.txt
index 8c99acf..0463c2c 100644
--- a/ui/ui-framework/api/restricted_current.txt
+++ b/ui/ui-framework/api/restricted_current.txt
@@ -412,7 +412,7 @@
public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/DeclarativeGraphicsDemo.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/DeclarativeGraphicsDemo.kt
new file mode 100644
index 0000000..e6a1ca6
--- /dev/null
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/DeclarativeGraphicsDemo.kt
@@ -0,0 +1,128 @@
+/*
+ * 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.ui.framework.demos
+
+import androidx.compose.Composable
+import androidx.ui.core.Alignment
+import androidx.ui.core.Modifier
+import androidx.ui.foundation.Canvas2
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.painter.inset
+import androidx.ui.graphics.painter.rotate
+import androidx.ui.graphics.painter.scale
+import androidx.ui.graphics.painter.translate
+import androidx.ui.layout.fillMaxSize
+import androidx.ui.layout.preferredSize
+import androidx.ui.layout.wrapContentSize
+import androidx.ui.unit.dp
+
+@Composable
+fun DeclarativeGraphicsDemo() {
+ /**
+ * Demo that shows how to leverage CanvasScope to draw 4 rectangular quadrants
+ * inset by a given dimension with a diamond drawn within each of the quadrants
+ */
+ Canvas2(modifier =
+ Modifier.fillMaxSize()
+ .wrapContentSize(Alignment.Center)
+ .preferredSize(120.dp, 120.dp)
+ ) {
+ drawRect(color = Color.Gray)
+ // Inset content by 10 pixels on the left/right sides and 12 by the
+ // top/bottom
+ inset(10.0f, 12.0f) {
+ val quadrantSize = size / 2.0f
+ drawRect(
+ size = quadrantSize,
+ color = Color.Red
+ )
+ // Scale the drawing environment down by 50% about the center of the square drawn
+ // in the top left quadrant
+ scale(0.5f, 0.5f, size.width / 4, size.height / 4) {
+ // Rotate the drawing environment 45 degrees about the center of the square
+ // drawn in the top left
+ rotate(45.0f, size.width / 4, size.height / 4) {
+ drawRect(
+ size = quadrantSize,
+ color = Color.Yellow,
+ alpha = 0.75f
+ )
+ }
+ }
+ // Translate the drawing environment to the right by half the size of the current
+ // width
+ translate(size.width / 2, 0.0f) {
+ drawRect(
+ size = quadrantSize,
+ color = Color.Yellow
+ )
+ // Scale the drawing environment down by 50% about the center of the square drawn
+ // in the top right quadrant
+ scale(0.5f, 0.5f, size.width / 4, size.height / 4) {
+ // rotate the drawing environment 45 degrees about the center of the drawn
+ // square in the top right
+ rotate(45.0f, size.width / 4, size.height / 4) {
+ drawRect(
+ size = quadrantSize,
+ color = Color.Red,
+ alpha = 0.75f
+ )
+ }
+ }
+ }
+ // Translate the drawing environment down by half the size of the current height
+ translate(0.0f, size.height / 2) {
+ drawRect(
+ size = quadrantSize,
+ color = Color.Green
+ )
+ // Scale the drawing environment down by 50% about the center of the square drawn
+ // in the bottom left quadrant
+ scale(0.5f, 0.5f, size.width / 4, size.height / 4) {
+ // Rotate the drawing environment by 45 degrees about the center of the
+ // square drawn in the bottom left quadrant
+ rotate(45.0f, size.width / 4, size.height / 4) {
+ drawRect(
+ size = quadrantSize,
+ color = Color.Blue,
+ alpha = 0.75f
+ )
+ }
+ }
+ }
+ // Translate the drawing environment to the bottom right quadrant of the inset bounds
+ translate(size.width / 2, size.height / 2) {
+ drawRect(
+ size = quadrantSize,
+ color = Color.Blue
+ )
+ // Scale the drawing environment down by 50% about the center of the square drawn
+ // in the bottom right quadrant
+ scale(0.5f, 0.5f, size.width / 4, size.height / 4) {
+ // Rotate the drawing environment 45 degrees about the center of the drawn
+ // square in the bottom right
+ rotate(45.0f, size.width / 4, size.height / 4) {
+ drawRect(
+ size = quadrantSize,
+ color = Color.Green,
+ alpha = 0.75f
+ )
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/FrameworkDemos.kt b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/FrameworkDemos.kt
index 6f11234..826e1ef 100644
--- a/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/FrameworkDemos.kt
+++ b/ui/ui-framework/integration-tests/framework-demos/src/main/java/androidx/ui/framework/demos/FrameworkDemos.kt
@@ -35,6 +35,7 @@
import androidx.ui.framework.demos.gestures.ScaleGestureDetectorDemo
import androidx.ui.framework.demos.gestures.TouchSlopDragGestureDetectorDemo
import androidx.ui.framework.demos.gestures.TouchSlopExceededGestureDetectorDemo
+import androidx.ui.framework.demos.viewinterop.ViewInComposeDemo
private val GestureDemos = DemoCategory("Gestures", listOf(
DemoCategory("Simple - Non-Movement", listOf(
@@ -62,11 +63,17 @@
))
))
+private val GraphicsDemos = DemoCategory("Graphics", listOf(
+ ComposableDemo("VectorGraphicsDemo") { VectorGraphicsDemo() },
+ ComposableDemo("DeclarativeGraphicsDemo") { DeclarativeGraphicsDemo() }
+))
+
val FrameworkDemos = DemoCategory("Framework", listOf(
ComposableDemo("Explicit autofill types") { ExplicitAutofillTypesDemo() },
ComposableDemo("Focus") { FocusableDemo() },
ComposableDemo("Multiple collects measure") { MultipleCollectTest() },
ComposableDemo("Popup") { PopupDemo() },
- ComposableDemo("Vector graphics") { VectorGraphicsDemo() },
- GestureDemos
+ GraphicsDemos,
+ GestureDemos,
+ ComposableDemo("View in compose") { ViewInComposeDemo() }
))
diff --git a/ui/ui-framework/samples/src/main/java/androidx/ui/framework/samples/PainterSample.kt b/ui/ui-framework/samples/src/main/java/androidx/ui/framework/samples/PainterSample.kt
index 1cdbe60..23ed33c 100644
--- a/ui/ui-framework/samples/src/main/java/androidx/ui/framework/samples/PainterSample.kt
+++ b/ui/ui-framework/samples/src/main/java/androidx/ui/framework/samples/PainterSample.kt
@@ -19,18 +19,12 @@
import androidx.annotation.Sampled
import androidx.compose.Composable
import androidx.ui.core.Modifier
-import androidx.ui.core.paint
-import androidx.ui.foundation.Box
+import androidx.ui.foundation.Image
import androidx.ui.foundation.drawBackground
-import androidx.ui.geometry.Offset
-import androidx.ui.graphics.BlendMode
-import androidx.ui.graphics.Canvas
import androidx.ui.graphics.Color
-import androidx.ui.graphics.ColorFilter
-import androidx.ui.graphics.Paint
import androidx.ui.graphics.painter.Painter
+import androidx.ui.graphics.painter.CanvasScope
import androidx.ui.layout.padding
-import androidx.ui.layout.preferredSize
import androidx.ui.unit.Px
import androidx.ui.unit.PxSize
import androidx.ui.unit.dp
@@ -40,40 +34,26 @@
fun PainterModifierSample() {
class CustomPainter : Painter() {
- val paint = Paint().apply {
- this.color = Color.Red
- }
-
override val intrinsicSize: PxSize
get() = PxSize(
Px(300.0f),
Px(300.0f)
)
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
- val size = intrinsicSize
- val width = size.width.value
- val height = size.height.value
- canvas.drawCircle(
- Offset(
- width / 2.0f,
- height / 2.0f
- ),
- width / 2.0f,
- paint
+ override fun CanvasScope.onDraw() {
+ drawCircle(
+ center = center,
+ radius = size.minDimension / 2.0f,
+ color = Color.Red
)
}
}
- Box(
- Modifier.preferredSize(300.dp)
- .drawBackground(Color.Gray)
- .padding(30.dp)
- .drawBackground(Color.Yellow)
- .paint(
- CustomPainter(),
- alpha = 0.5f,
- colorFilter = ColorFilter(Color.Cyan, BlendMode.srcIn)
- )
+ Image(
+ modifier =
+ Modifier.drawBackground(Color.Gray)
+ .padding(30.dp)
+ .drawBackground(Color.Yellow),
+ painter = CustomPainter()
)
}
\ No newline at end of file
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt
index 27a389c..45fe708 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt
@@ -29,14 +29,12 @@
import androidx.ui.core.test.background
import androidx.ui.core.test.waitAndScreenShot
import androidx.ui.framework.test.TestActivity
-import androidx.ui.geometry.Rect
import androidx.ui.graphics.BlendMode
-import androidx.ui.graphics.Canvas
import androidx.ui.graphics.Color
import androidx.ui.graphics.ColorFilter
import androidx.ui.graphics.DefaultAlpha
-import androidx.ui.graphics.Paint
import androidx.ui.graphics.compositeOver
+import androidx.ui.graphics.painter.CanvasScope
import androidx.ui.graphics.painter.Painter
import androidx.ui.graphics.toArgb
import androidx.ui.unit.IntPx
@@ -376,7 +374,7 @@
latch: CountDownLatch
) {
with(DensityAmbient.current) {
- val p = LatchPainter(containerWidth, containerHeight, latch, rtl)
+ val p = LatchPainter(containerWidth, containerHeight, latch)
AtLeastSize(
modifier = Modifier.background(Color.White)
.paint(p, alpha = alpha, colorFilter = colorFilter, rtl = rtl),
@@ -397,23 +395,24 @@
private class LatchPainter(
val width: Float,
val height: Float,
- val latch: CountDownLatch,
- val rtl: Boolean = false
+ val latch: CountDownLatch
) : Painter() {
+
+ var color = Color.Red
+
override val intrinsicSize: PxSize
get() = PxSize(
Px(width),
Px(height)
)
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
- val paint = Paint().apply {
- this.color = if (rtl) Color.Blue else Color.Red
- }
- canvas.drawRect(
- Rect.fromLTWH(0.0f, 0.0f, bounds.width.value, bounds.height.value),
- paint
- )
+ override fun applyRtl(rtl: Boolean): Boolean {
+ color = if (rtl) Color.Blue else Color.Red
+ return true
+ }
+
+ override fun CanvasScope.onDraw() {
+ drawRect(color = color)
latch.countDown()
}
}
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidViewCompatTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidViewCompatTest.kt
index b225d18..f024a49 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidViewCompatTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/core/test/AndroidViewCompatTest.kt
@@ -200,12 +200,141 @@
.assertPixels(expectedColorProvider = expectedPixelColor)
}
+ // When incoming constraints are fixed.
+
@Test
- fun testMeasurement_isDoneWithCorrectMeasureSpecs() {
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_1() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(20, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(30, MeasureSpec.EXACTLY),
+ Constraints.fixed(20.ipx, 30.ipx),
+ ViewGroup.LayoutParams(40, 50)
+ )
+ }
+
+ @Test
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_2() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(20, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(30, MeasureSpec.EXACTLY),
+ Constraints.fixed(20.ipx, 30.ipx),
+ ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
+ )
+ }
+
+ @Test
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_3() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(20, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(30, MeasureSpec.EXACTLY),
+ Constraints.fixed(20.ipx, 30.ipx),
+ ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
+ )
+ }
+
+ // When incoming constraints are finite.
+
+ @Test
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_4() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(25, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(35, MeasureSpec.EXACTLY),
+ Constraints(
+ minWidth = 20.ipx, maxWidth = 30.ipx, minHeight = 35.ipx, maxHeight = 45.ipx
+ ),
+ ViewGroup.LayoutParams(25, 35)
+ )
+ }
+
+ @Test
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_5() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(20, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(35, MeasureSpec.EXACTLY),
+ Constraints(
+ minWidth = 20.ipx, maxWidth = 30.ipx, minHeight = 35.ipx, maxHeight = 45.ipx
+ ),
+ ViewGroup.LayoutParams(15, 25)
+ )
+ }
+
+ @Test
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_6() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(30, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(45, MeasureSpec.EXACTLY),
+ Constraints(
+ minWidth = 20.ipx, maxWidth = 30.ipx, minHeight = 35.ipx, maxHeight = 45.ipx
+ ),
+ ViewGroup.LayoutParams(35, 50)
+ )
+ }
+
+ @Test
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_7() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(40, MeasureSpec.AT_MOST),
+ MeasureSpec.makeMeasureSpec(50, MeasureSpec.AT_MOST),
+ Constraints(maxWidth = 40.ipx, maxHeight = 50.ipx),
+ ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
+ )
+ }
+
+ @Test
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_8() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(40, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY),
+ Constraints(maxWidth = 40.ipx, maxHeight = 50.ipx),
+ ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
+ )
+ }
+
+ // When incoming constraints are infinite.
+
+ @Test
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_9() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(25, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(35, MeasureSpec.EXACTLY),
+ Constraints(),
+ ViewGroup.LayoutParams(25, 35)
+ )
+ }
+
+ @Test
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_10() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
+ Constraints(),
+ ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
+ )
+ }
+
+ @Test
+ fun testMeasurement_isDoneWithCorrectMeasureSpecs_11() {
+ testMeasurement_isDoneWithCorrectMeasureSpecs(
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
+ Constraints(),
+ ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
+ )
+ }
+
+ private fun testMeasurement_isDoneWithCorrectMeasureSpecs(
+ expectedWidthSpec: Int,
+ expectedHeightSpec: Int,
+ constraints: Constraints,
+ layoutParams: ViewGroup.LayoutParams
+ ) {
val viewRef = Ref<MeasureSpecSaverView>()
val widthMeasureSpecRef = Ref<Int>()
val heightMeasureSpecRef = Ref<Int>()
- val constraintsHolder = ConstraintsModel(Constraints())
+ // Unique starting constraints so that new constraints are different and thus recomp is
+ // guaranteed.
+ val constraintsHolder = ConstraintsModel(Constraints.fixed(1234.ipx, 5678.ipx))
+
composeTestRule.setContent {
Container(LayoutConstraints(constraintsHolder.constraints)) {
MeasureSpecSaverView(
@@ -215,97 +344,16 @@
)
}
}
- fun assertMeasureSpec(
- expectedWidthSpec: Int,
- expectedHeightSpec: Int,
- constraints: Constraints,
- layoutParams: ViewGroup.LayoutParams
- ) {
- runOnUiThread {
- constraintsHolder.constraints = constraints
- viewRef.value?.layoutParams = layoutParams
- }
- runOnIdleCompose {
- assertEquals(expectedWidthSpec, widthMeasureSpecRef.value)
- assertEquals(expectedHeightSpec, heightMeasureSpecRef.value)
- }
+ runOnUiThread {
+ constraintsHolder.constraints = constraints
+ viewRef.value?.layoutParams = layoutParams
}
- // When incoming constraints are fixed.
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(20, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(30, MeasureSpec.EXACTLY),
- Constraints.fixed(20.ipx, 30.ipx),
- ViewGroup.LayoutParams(40, 50)
- )
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(20, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(30, MeasureSpec.EXACTLY),
- Constraints.fixed(20.ipx, 30.ipx),
- ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
- )
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(20, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(30, MeasureSpec.EXACTLY),
- Constraints.fixed(20.ipx, 30.ipx),
- ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
- )
- // When incoming constraints are finite.
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(25, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(35, MeasureSpec.EXACTLY),
- Constraints(
- minWidth = 20.ipx, maxWidth = 30.ipx, minHeight = 35.ipx, maxHeight = 45.ipx
- ),
- ViewGroup.LayoutParams(25, 35)
- )
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(20, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(35, MeasureSpec.EXACTLY),
- Constraints(
- minWidth = 20.ipx, maxWidth = 30.ipx, minHeight = 35.ipx, maxHeight = 45.ipx
- ),
- ViewGroup.LayoutParams(15, 25)
- )
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(30, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(45, MeasureSpec.EXACTLY),
- Constraints(
- minWidth = 20.ipx, maxWidth = 30.ipx, minHeight = 35.ipx, maxHeight = 45.ipx
- ),
- ViewGroup.LayoutParams(35, 50)
- )
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(40, MeasureSpec.AT_MOST),
- MeasureSpec.makeMeasureSpec(50, MeasureSpec.AT_MOST),
- Constraints(maxWidth = 40.ipx, maxHeight = 50.ipx),
- ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
- )
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(40, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(50, MeasureSpec.EXACTLY),
- Constraints(maxWidth = 40.ipx, maxHeight = 50.ipx),
- ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
- )
- // When incoming constraints are infinite.
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(25, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(35, MeasureSpec.EXACTLY),
- Constraints(),
- ViewGroup.LayoutParams(25, 35)
- )
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
- Constraints(),
- ViewGroup.LayoutParams(WRAP_CONTENT, WRAP_CONTENT)
- )
- assertMeasureSpec(
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
- MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
- Constraints(),
- ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT)
- )
+
+ runOnIdleCompose {
+ assertEquals(expectedWidthSpec, widthMeasureSpecRef.value)
+ assertEquals(expectedHeightSpec, heightMeasureSpecRef.value)
+ }
}
@Test
diff --git a/ui/ui-framework/src/androidTest/java/androidx/ui/node/PointerInteropFilterTest.kt b/ui/ui-framework/src/androidTest/java/androidx/ui/node/PointerInteropFilterTest.kt
index da10c61..eb17f9c 100644
--- a/ui/ui-framework/src/androidTest/java/androidx/ui/node/PointerInteropFilterTest.kt
+++ b/ui/ui-framework/src/androidTest/java/androidx/ui/node/PointerInteropFilterTest.kt
@@ -21,7 +21,6 @@
import android.view.MotionEvent.ACTION_CANCEL
import android.view.MotionEvent.ACTION_DOWN
import android.view.MotionEvent.TOOL_TYPE_UNKNOWN
-import android.widget.FrameLayout
import androidx.activity.ComponentActivity
import androidx.test.filters.SmallTest
import androidx.ui.core.PointerEventPass
@@ -36,6 +35,7 @@
import androidx.ui.testutils.moveTo
import androidx.ui.testutils.up
import androidx.ui.unit.milliseconds
+import androidx.ui.viewinterop.AndroidViewHolder
import com.google.common.truth.Truth.assertThat
import org.junit.Before
import org.junit.Rule
@@ -1635,12 +1635,11 @@
}
@Test
- fun onPointerInput_pointerMove_dispatchedDuringFinalTunnel() {
+ fun onPointerInput_pointerMove_dispatchedDuringPostTunnel() {
val down = down(1, 2.milliseconds, 3f, 4f)
val move = down.moveTo(7.milliseconds, 8f, 9f)
-
pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverAllPasses(down)
-
+ mockViewGroup.dispatchedMotionEvents.clear()
pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverPasses(
move,
PointerEventPass.InitialDown,
@@ -1649,14 +1648,89 @@
PointerEventPass.PostUp
)
- assertThat(mockViewGroup.dispatchedMotionEvents).hasSize(1)
+ assertThat(mockViewGroup.dispatchedMotionEvents).hasSize(0)
pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverPasses(
move,
PointerEventPass.PostDown
)
- assertThat(mockViewGroup.dispatchedMotionEvents).hasSize(2)
+ assertThat(mockViewGroup.dispatchedMotionEvents).hasSize(1)
+ }
+
+ @Test
+ fun onPointerInput_downDisallowInterceptRequestedMove_moveDispatchedDuringInitialTunnel() {
+ val down = down(1, 2.milliseconds, 3f, 4f)
+ val move = down.moveTo(7.milliseconds, 8f, 9f)
+
+ pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverAllPasses(down)
+ mockViewGroup.dispatchedMotionEvents.clear()
+
+ mockViewGroup.requestDisallowInterceptTouchEvent(true)
+
+ pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverPasses(
+ move,
+ PointerEventPass.InitialDown
+ )
+
+ assertThat(mockViewGroup.dispatchedMotionEvents).hasSize(1)
+ }
+
+ @Test
+ fun onPointerInput_disallowInterceptRequestedUpDownMove_moveDispatchedDuringPostTunnel() {
+ val downA = down(1, 2.milliseconds, 3f, 4f)
+ val upA = downA.up(11.milliseconds)
+ val downB = down(21, 22.milliseconds, 23f, 24f)
+ val moveB = downB.moveTo(31.milliseconds, 32f, 33f)
+
+ pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverAllPasses(downA)
+ mockViewGroup.requestDisallowInterceptTouchEvent(true)
+ pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverAllPasses(upA)
+ pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverAllPasses(downB)
+ mockViewGroup.dispatchedMotionEvents.clear()
+ pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverPasses(
+ moveB,
+ PointerEventPass.InitialDown,
+ PointerEventPass.PreUp,
+ PointerEventPass.PreDown,
+ PointerEventPass.PostUp
+ )
+
+ assertThat(mockViewGroup.dispatchedMotionEvents).hasSize(0)
+
+ pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverPasses(
+ moveB,
+ PointerEventPass.PostDown
+ )
+
+ assertThat(mockViewGroup.dispatchedMotionEvents).hasSize(1)
+ }
+
+ @Test
+ fun onPointerInput_disallowInterceptTrueThenFalseThenMove_moveDispatchedDuringPostTunnel() {
+ val down = down(1, 2.milliseconds, 3f, 4f)
+ val move = down.moveTo(7.milliseconds, 8f, 9f)
+
+ pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverAllPasses(down)
+ mockViewGroup.requestDisallowInterceptTouchEvent(true)
+ mockViewGroup.requestDisallowInterceptTouchEvent(false)
+ mockViewGroup.dispatchedMotionEvents.clear()
+ pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverPasses(
+ move,
+ PointerEventPass.InitialDown,
+ PointerEventPass.PreUp,
+ PointerEventPass.PreDown,
+ PointerEventPass.PostUp
+ )
+
+ assertThat(mockViewGroup.dispatchedMotionEvents).hasSize(0)
+
+ pointerInteropFilter.pointerInputFilter::onPointerInput.invokeOverPasses(
+ move,
+ PointerEventPass.PostDown
+ )
+
+ assertThat(mockViewGroup.dispatchedMotionEvents).hasSize(1)
}
@Test
@@ -1866,7 +1940,7 @@
}
@Test
- fun onPointerInput_pointerMove_consumedDuringFinalTunnel() {
+ fun onPointerInput_pointerMove_consumedDuringPostTunnel() {
val down = down(1, 2.milliseconds, 3f, 4f)
val move = down.moveTo(7.milliseconds, 8f, 9f)
@@ -2000,7 +2074,7 @@
}
}
-class MockViewGroup(context: Context) : FrameLayout(context) {
+internal class MockViewGroup(context: Context) : AndroidViewHolder(context) {
var dispatchedMotionEvents = mutableListOf<MotionEvent>()
var returnValue = true
@@ -2034,7 +2108,8 @@
eventTime.toLong(),
action + (actionIndex shl MotionEvent.ACTION_POINTER_INDEX_SHIFT),
numPointers,
- pointerProperties,
+ // TODO(shepshapard): This is bad and temporary
+ pointerProperties.map { PointerProperties(it.id % 32) }.toTypedArray(),
pointerCoords,
0,
0,
diff --git a/ui/ui-framework/src/main/java/androidx/ui/core/PainterModifier.kt b/ui/ui-framework/src/main/java/androidx/ui/core/PainterModifier.kt
index 70dd418..df172d9 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/core/PainterModifier.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/core/PainterModifier.kt
@@ -242,7 +242,7 @@
painter.draw(
canvas = this,
- bounds = PxSize(srcWidth, srcHeight),
+ size = PxSize(srcWidth, srcHeight),
alpha = alpha,
colorFilter = colorFilter,
rtl = rtl)
diff --git a/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorPainter.kt b/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorPainter.kt
index 50af72a..fcecbe0 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorPainter.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/graphics/vector/VectorPainter.kt
@@ -22,9 +22,10 @@
import androidx.compose.onPreCommit
import androidx.compose.remember
import androidx.ui.core.DensityAmbient
-import androidx.ui.graphics.Canvas
import androidx.ui.graphics.ColorFilter
import androidx.ui.graphics.painter.Painter
+import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.drawCanvas
import androidx.ui.unit.Dp
import androidx.ui.unit.IntPx
import androidx.ui.unit.Px
@@ -113,8 +114,8 @@
IntPx(ceil(vector.defaultHeight.value).roundToInt())
)
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
- vector.draw(canvas, currentAlpha, currentColorFilter)
+ override fun CanvasScope.onDraw() {
+ drawCanvas { canvas, _ -> vector.draw(canvas, currentAlpha, currentColorFilter) }
}
override fun applyAlpha(alpha: Float): Boolean {
diff --git a/ui/ui-framework/src/main/java/androidx/ui/node/PointerInteropFilter.kt b/ui/ui-framework/src/main/java/androidx/ui/node/PointerInteropFilter.kt
index b9ed6c1..89f7831 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/node/PointerInteropFilter.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/node/PointerInteropFilter.kt
@@ -17,7 +17,6 @@
package androidx.ui.node
import android.os.SystemClock
-import android.view.View
import androidx.ui.core.Modifier
import androidx.ui.core.PointerEventPass
import androidx.ui.core.PointerInputChange
@@ -29,20 +28,89 @@
import androidx.ui.core.pointerinput.PointerInputModifier
import androidx.ui.unit.IntPxSize
import androidx.ui.unit.milliseconds
+import androidx.ui.viewinterop.AndroidViewHolder
-internal fun Modifier.pointerInteropModifier(view: View): Modifier {
+internal fun Modifier.pointerInteropModifier(view: AndroidViewHolder): Modifier {
return this + PointerInteropFilter(view)
}
-internal class PointerInteropFilter(val view: View) : PointerInputModifier {
+/**
+ * A special PointerInputModifier that manages pointer input interaction with child Android Views
+ * following Android conventions.
+ *
+ * All interactions with the Android View occur through it's associated [AndroidViewHolder].
+ *
+ * When the type of event is not a movement event, we dispatch to the Android View as soon as
+ * possible (during [PointerEventPass.InitialDown]) so that the Android View can react to down
+ * and up events before Compose PointerInputModifiers normally would.
+ *
+ * When the type of event is a movement event, we dispatch to the Android View during
+ * [PointerEventPass.PostDown] to allow Compose PointerInputModifiers to react to movement first,
+ * which mimics a ViewParent intercepting the event stream.
+ *
+ * Whenever we are about to dispatch to the Android View, we check to see if anything in Compose
+ * consumed any aspect of the pointer input changes, and if they did, we intercept the stream and
+ * dispatch ACTION_CANCEL to the Android View if they have already returned true for a call to
+ * View#dispatchTouchEvent(...).
+ *
+ * If we do dispatch to the View, and it returns true, we consume all of the changes so that
+ * nothing in Compose also responds.
+ *
+ * If the Android View calls ViewParent#requestDisallowInterceptTouchEvent with a value of true, we
+ * simply dispatch move events during [PointerEventPass.InitialDown] so that normal
+ * PointerInputModifiers don't get a chance to consume first. Note: This does mean that it is
+ * possible for a Compose PointerInputModifier to "intercept" even after
+ * requestDisallowInterceptTouchEvent has been called because consumption can occur during
+ * [PointerEventPass.InitialDown]. This may seem like a flaw, but in reality, any
+ * PointerInputModifier that consumes that aggressively would likely only do so after some
+ * consumption already occurred on a later pass, and this ability to do so is on par with a
+ * ViewGroup's ability to override dispatchTouchEvent instead of overriding the more usual
+ * onTouchEvent and onInterceptTouchEvent.
+ *
+ * If the Android View calls ViewParent#requestDisallowInterceptTouchEvent is later called again
+ * but with false (exceedingly rare in Android), we revert back to the normal behavior.
+ */
+internal class PointerInteropFilter(
+ /**
+ * The [AndroidViewHolder] that contains the Android View we are dispatching to.
+ */
+ val view: AndroidViewHolder
+) : PointerInputModifier {
+ /**
+ * The 3 possible states
+ */
private enum class DispatchToViewState {
- Unknown, Dispatching, NotDispatching
+ /**
+ * We have yet to dispatch a new event stream to the child Android View.
+ */
+ Unknown,
+ /**
+ * We have dispatched to the child Android View and it wants to continue to receive
+ * events for the current event stream.
+ */
+ Dispatching,
+ /**
+ * We intercepted the event stream, or the Android View no longer wanted to receive
+ * events for the current event stream.
+ */
+ NotDispatching
}
override val pointerInputFilter =
object : PointerInputFilter() {
+
+ init {
+ // Setup so that we are notified when the child Android View calls
+ // ViewParent#requestDisallowInterceptTouchEvent.
+ view.onRequestDisallowInterceptTouchEvent =
+ { disallowIntercept ->
+ this.disallowIntercept = disallowIntercept
+ }
+ }
+
private var state = DispatchToViewState.Unknown
+ private var disallowIntercept = false
override fun onPointerInput(
changes: List<PointerInputChange>,
@@ -52,23 +120,26 @@
@Suppress("NAME_SHADOWING")
var changes = changes
- if (state !== DispatchToViewState.NotDispatching) {
- if (pass == PointerEventPass.InitialDown &&
+ // If we were told to disallow intercept, or if the event was a down or up event,
+ // we dispatch to Android as early as possible. If the event is a move event and
+ // we can still intercept, we dispatch to Android after we have a chance to
+ // intercept due to movement.
+ val dispatchDuringInitialTunnel = disallowIntercept ||
changes.any {
it.changedToDownIgnoreConsumed() || it.changedToUpIgnoreConsumed()
}
- ) {
- changes = dispatchToMotionEvent(changes)
+
+ if (state !== DispatchToViewState.NotDispatching) {
+ if (pass == PointerEventPass.InitialDown && dispatchDuringInitialTunnel) {
+ changes = dispatchToView(changes)
}
- if (pass == PointerEventPass.PostDown &&
- changes.none {
- it.changedToDownIgnoreConsumed() || it.changedToUpIgnoreConsumed()
- }
- ) {
- changes = dispatchToMotionEvent(changes)
+ if (pass == PointerEventPass.PostDown && !dispatchDuringInitialTunnel) {
+ changes = dispatchToView(changes)
}
}
if (pass == PointerEventPass.PostDown) {
+ // If all of the changes were up changes, then the "event stream" has ended
+ // and we reset.
if (changes.all { it.changedToUpIgnoreConsumed() }) {
reset()
}
@@ -77,10 +148,8 @@
}
override fun onCancel() {
- // TODO(shepshapard): We have to know if the cancel event was caused by our View
- // calling ViewParent#requestDisallowInterceptTouchEvent(boolean), or if we
- // are cancelling for some other reason. If our view called
- // requestDisallowInterceptTouchEvent, we shouldn't cancel them.
+ // If we are still dispatching to the Android View, we have to send them a
+ // cancel event, otherwise, we should not.
if (state === DispatchToViewState.Dispatching) {
emptyCancelMotionEventScope(
SystemClock.uptimeMillis().milliseconds
@@ -91,24 +160,42 @@
}
}
+ /**
+ * Resets all of our state to be ready for a "new event stream".
+ */
private fun reset() {
state = DispatchToViewState.Unknown
+ disallowIntercept = false
}
- private fun dispatchToMotionEvent(changes: List<PointerInputChange>):
+ /**
+ * Dispatches to the Android View.
+ *
+ * Also consumes aspects of [changes] and updates our [state] accordingly.
+ *
+ * Will dispatch ACTION_CANCEL if any aspect of [changes] has been consumed and
+ * update our [state] accordingly.
+ *
+ * @param changes The changes to dispatch.
+ * @return The resulting changes (fully consumed or untouched).
+ */
+ private fun dispatchToView(changes: List<PointerInputChange>):
List<PointerInputChange> {
@Suppress("NAME_SHADOWING")
var changes = changes
if (changes.any { it.anyChangeConsumed() }) {
+ // We should no longer dispatch to the Android View.
if (state === DispatchToViewState.Dispatching) {
+ // If we were dipatching, send ACTION_CANCEL.
changes.toCancelMotionEventScope { motionEvent ->
view.dispatchTouchEvent(motionEvent)
}
}
state = DispatchToViewState.NotDispatching
} else {
+ // Dispatch and update our state with the result.
changes.toMotionEventScope { motionEvent ->
state = if (view.dispatchTouchEvent(motionEvent)) {
DispatchToViewState.Dispatching
@@ -117,6 +204,7 @@
}
}
if (state === DispatchToViewState.Dispatching) {
+ // If the Android View claimed the event, consume all changes.
changes = changes.map { it.consumeAllChanges() }
}
}
diff --git a/ui/ui-framework/src/main/java/androidx/ui/node/PointerInteropUtils.kt b/ui/ui-framework/src/main/java/androidx/ui/node/PointerInteropUtils.kt
index f21e4a5..1719e8d 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/node/PointerInteropUtils.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/node/PointerInteropUtils.kt
@@ -53,9 +53,9 @@
}
}
- // TODO(b/154136736): toInt() is clearly not right.
+ // TODO(b/154136736): "(it.id.value % 32).toInt()" is very fishy.
val pointerProperties =
- map { PointerProperties(it.id.value.toInt()) }
+ map { PointerProperties((it.id.value % 32).toInt()) }
.toTypedArray()
val pointerCoords =
map {
diff --git a/ui/ui-framework/src/main/java/androidx/ui/node/UiComposer.kt b/ui/ui-framework/src/main/java/androidx/ui/node/UiComposer.kt
index 27bf1c9..3242cc3 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/node/UiComposer.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/node/UiComposer.kt
@@ -27,6 +27,7 @@
import androidx.compose.Recomposer
import androidx.compose.SlotTable
import androidx.ui.core.ComponentNode
+import androidx.ui.viewinterop.AndroidViewHolder
// TODO: evaluate if this class is necessary or not
private class Stack<T> {
@@ -131,10 +132,20 @@
}
is ComponentNode ->
when (instance) {
- is View -> parent.insertAt(
- index,
- instance.toComponentNode()
- )
+ is View -> {
+ // Wrap the instance in an AndroidViewHolder, unless the instance
+ // itself is already one.
+ val androidViewHolder =
+ if (instance is AndroidViewHolder) {
+ instance
+ } else {
+ AndroidViewHolder(instance.context).apply {
+ view = instance
+ }
+ }
+
+ parent.insertAt(index, androidViewHolder.toComponentNode())
+ }
is ComponentNode -> parent.insertAt(index, instance)
else -> invalidNode(instance)
}
diff --git a/ui/ui-framework/src/main/java/androidx/ui/node/ViewInterop.kt b/ui/ui-framework/src/main/java/androidx/ui/node/ViewInterop.kt
index 3bcb9c3..39db2e8 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/node/ViewInterop.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/node/ViewInterop.kt
@@ -16,8 +16,10 @@
package androidx.ui.node
+import android.content.Context
import android.view.View
import android.view.ViewGroup
+import android.widget.FrameLayout
import androidx.annotation.RestrictTo
import androidx.ui.core.AndroidOwner
import androidx.ui.core.ComponentNode
@@ -31,6 +33,7 @@
import androidx.ui.unit.IntPx
import androidx.ui.unit.ipx
import androidx.ui.unit.isFinite
+import androidx.ui.viewinterop.AndroidViewHolder
/**
* @suppress
@@ -90,7 +93,7 @@
* Builds a [ComponentNode] tree representation for an Android [View].
* The component nodes will proxy the Compose core calls to the [View].
*/
-internal fun View.toComponentNode(): ComponentNode {
+internal fun AndroidViewHolder.toComponentNode(): ComponentNode {
// TODO(soboleva): add layout direction here?
// TODO(popam): forward pointer input, accessibility, focus
// Prepare layout node that proxies measure and layout passes to the View.
@@ -114,22 +117,24 @@
layoutDirection: LayoutDirection
): MeasureScope.MeasureResult {
if (constraints.minWidth != 0.ipx) {
- minimumWidth = constraints.minWidth.value
+ getChildAt(0).minimumWidth = constraints.minWidth.value
}
if (constraints.minHeight != 0.ipx) {
- minimumHeight = constraints.minHeight.value
+ getChildAt(0).minimumHeight = constraints.minHeight.value
}
// TODO (soboleva): native view should get LD value from Compose?
+
+ // TODO(shepshapard): !! necessary?
measure(
obtainMeasureSpec(
constraints.minWidth,
constraints.maxWidth,
- layoutParams.width
+ layoutParams!!.width
),
obtainMeasureSpec(
constraints.minHeight,
constraints.maxHeight,
- layoutParams.height
+ layoutParams!!.height
)
)
return measureScope.layout(measuredWidth.ipx, measuredHeight.ipx) {
diff --git a/ui/ui-framework/src/main/java/androidx/ui/viewinterop/ComposedView.kt b/ui/ui-framework/src/main/java/androidx/ui/viewinterop/ComposedView.kt
index 8e7a437..651d7fe 100644
--- a/ui/ui-framework/src/main/java/androidx/ui/viewinterop/ComposedView.kt
+++ b/ui/ui-framework/src/main/java/androidx/ui/viewinterop/ComposedView.kt
@@ -52,7 +52,8 @@
AndroidViewHolder(view = view)
}
-private class AndroidViewHolder(context: Context) : ViewGroup(context) {
+// Open to be mockable in tests.
+internal open class AndroidViewHolder(context: Context) : ViewGroup(context) {
var view: View? = null
set(value) {
if (value != field) {
@@ -75,6 +76,8 @@
}
}
+ var onRequestDisallowInterceptTouchEvent: ((Boolean) -> Unit)? = null
+
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
view?.measure(widthMeasureSpec, heightMeasureSpec)
setMeasuredDimension(view?.measuredWidth ?: 0, view?.measuredHeight ?: 0)
@@ -87,4 +90,9 @@
override fun getLayoutParams(): LayoutParams? {
return view?.layoutParams ?: LayoutParams(MATCH_PARENT, MATCH_PARENT)
}
+
+ override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
+ onRequestDisallowInterceptTouchEvent?.invoke(disallowIntercept)
+ super.requestDisallowInterceptTouchEvent(disallowIntercept)
+ }
}
diff --git a/ui/ui-geometry/api/0.1.0-dev11.txt b/ui/ui-geometry/api/0.1.0-dev11.txt
index 4ad12c3..390ba95 100644
--- a/ui/ui-geometry/api/0.1.0-dev11.txt
+++ b/ui/ui-geometry/api/0.1.0-dev11.txt
@@ -1,36 +1,38 @@
// Signature format: 3.0
package androidx.ui.geometry {
- public final class Offset implements androidx.ui.geometry.OffsetBase {
- ctor public Offset(float dx, float dy);
- method public infix androidx.ui.geometry.Rect and(androidx.ui.geometry.Size other);
- method public float component1();
- method public float component2();
- method public androidx.ui.geometry.Offset copy(float dx, float dy);
- method public operator androidx.ui.geometry.Offset div(float operand);
- method public float getDirection();
- method public float getDistance();
- method public float getDistanceSquared();
- method public float getDx();
- method public float getDy();
- method public operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset plus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset rem(float operand);
- method public androidx.ui.geometry.Offset scale(float scaleX, float scaleY);
- method public operator androidx.ui.geometry.Offset times(float operand);
- method public androidx.ui.geometry.Offset translate(float translateX, float translateY);
- method public androidx.ui.geometry.Offset truncDiv(float operand);
- method public operator androidx.ui.geometry.Offset unaryMinus();
+ public final inline class Offset {
+ ctor public Offset();
+ method public static infix androidx.ui.geometry.Rect and-b2zCL34(long $this, long other);
+ method public static long constructor-impl(internal long packedValue);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static float getDirection-impl(long $this);
+ method public static float getDistance-impl(long $this);
+ method public static float getDistanceSquared-impl(long $this);
+ method public static float getDx-impl(long $this);
+ method public static float getDy-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static long scale-impl(long $this, float scaleX, float scaleY);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long translate-impl(long $this, float translateX, float translateY);
+ method public static long truncDiv-impl(long $this, float operand);
+ method public static operator long unaryMinus-impl(long $this);
field public static final androidx.ui.geometry.Offset.Companion! Companion;
}
public static final class Offset.Companion {
- method public androidx.ui.geometry.Offset getInfinite();
- method public androidx.ui.geometry.Offset getZero();
- method public boolean isValid(androidx.ui.geometry.Offset offset);
- method public androidx.ui.geometry.Offset lerp(androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset stop, float fraction);
- property public final androidx.ui.geometry.Offset infinite;
- property public final androidx.ui.geometry.Offset zero;
+ method public long getInfinite();
+ method public long getZero();
+ method public boolean isValid-RIqb49o(long offset);
+ method public long lerp-nqy8KaQ(long start, long stop, float fraction);
+ property public final long infinite;
+ property public final long zero;
}
public interface OffsetBase {
@@ -46,6 +48,10 @@
property public abstract float dy;
}
+ public final class OffsetKt {
+ method public static long Offset(float dx, float dy);
+ }
+
public final class RRect {
ctor public RRect(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method public float component1();
@@ -60,7 +66,7 @@
method public float component7();
method public float component8();
method public float component9();
- method public boolean contains(androidx.ui.geometry.Offset point);
+ method public boolean contains-RIqb49o(long point);
method public androidx.ui.geometry.RRect copy(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method @Deprecated public androidx.ui.geometry.RRect deflate(float delta);
method public float getBottom();
@@ -98,7 +104,7 @@
method public static androidx.ui.geometry.RRect RRect(androidx.ui.geometry.Rect rect, androidx.ui.geometry.Radius topLeft = Radius.zero, androidx.ui.geometry.Radius topRight = Radius.zero, androidx.ui.geometry.Radius bottomRight = Radius.zero, androidx.ui.geometry.Radius bottomLeft = Radius.zero);
method public static androidx.ui.geometry.Radius bottomLeftRadius(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius bottomRightRadius(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.Offset center(androidx.ui.geometry.RRect);
+ method public static long center(androidx.ui.geometry.RRect);
method public static float getLongestSide(androidx.ui.geometry.RRect);
method public static float getShortestSide(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.RRect grow(androidx.ui.geometry.RRect, float delta);
@@ -113,7 +119,7 @@
method public static androidx.ui.geometry.Rect middleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect outerRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect safeInnerRect(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.RRect shift(androidx.ui.geometry.RRect, androidx.ui.geometry.Offset offset);
+ method public static androidx.ui.geometry.RRect shift-q6ZkaaM(androidx.ui.geometry.RRect, long offset);
method public static androidx.ui.geometry.RRect shrink(androidx.ui.geometry.RRect, float delta);
method public static androidx.ui.geometry.Rect tallMiddleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius topLeftRadius(androidx.ui.geometry.RRect);
@@ -156,27 +162,27 @@
method public float component2();
method public float component3();
method public float component4();
- method public boolean contains(androidx.ui.geometry.Offset offset);
+ method public boolean contains-RIqb49o(long offset);
method public androidx.ui.geometry.Rect copy(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect deflate(float delta);
method public androidx.ui.geometry.Rect expandToInclude(androidx.ui.geometry.Rect other);
method public float getBottom();
- method public androidx.ui.geometry.Offset getBottomCenter();
- method public androidx.ui.geometry.Offset getBottomLeft();
- method public androidx.ui.geometry.Offset getBottomRight();
- method public androidx.ui.geometry.Offset getCenter();
- method public androidx.ui.geometry.Offset getCenterLeft();
- method public androidx.ui.geometry.Offset getCenterRight();
+ method public long getBottomCenter();
+ method public long getBottomLeft();
+ method public long getBottomRight();
+ method public long getCenter();
+ method public long getCenterLeft();
+ method public long getCenterRight();
method public float getHeight();
method public float getLeft();
- method public float getLongestSide();
+ method public float getMaxDimension();
+ method public float getMinDimension();
method public float getRight();
- method public float getShortestSide();
- method public androidx.ui.geometry.Size getSize();
+ method public long getSize();
method public float getTop();
- method public androidx.ui.geometry.Offset getTopCenter();
- method public androidx.ui.geometry.Offset getTopLeft();
- method public androidx.ui.geometry.Offset getTopRight();
+ method public long getTopCenter();
+ method public long getTopLeft();
+ method public long getTopRight();
method public float getWidth();
method public androidx.ui.geometry.Rect inflate(float delta);
method public androidx.ui.geometry.Rect intersect(androidx.ui.geometry.Rect other);
@@ -185,18 +191,20 @@
method public boolean isInfinite();
method public androidx.ui.geometry.Rect join(androidx.ui.geometry.Rect other);
method public boolean overlaps(androidx.ui.geometry.Rect other);
- method public androidx.ui.geometry.Rect shift(androidx.ui.geometry.Offset offset);
+ method public androidx.ui.geometry.Rect shift-RIqb49o(long offset);
method public androidx.ui.geometry.Rect translate(float translateX, float translateY);
property public final float height;
+ property public final float maxDimension;
+ property public final float minDimension;
property public final float width;
field public static final androidx.ui.geometry.Rect.Companion! Companion;
}
public static final class Rect.Companion {
- method public androidx.ui.geometry.Rect fromCircle(androidx.ui.geometry.Offset center, float radius);
+ method public androidx.ui.geometry.Rect fromCircle-hSKLB2U(long center, float radius);
method public androidx.ui.geometry.Rect fromLTRB(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect fromLTWH(float left, float top, float width, float height);
- method public androidx.ui.geometry.Rect fromPoints(androidx.ui.geometry.Offset a, androidx.ui.geometry.Offset b);
+ method public androidx.ui.geometry.Rect fromPoints-cs1Rg_A(long a, long b);
method public androidx.ui.geometry.Rect getLargest();
method public androidx.ui.geometry.Rect getZero();
method public float get_giantScalar();
@@ -209,49 +217,54 @@
method public static androidx.ui.geometry.Rect lerp(androidx.ui.geometry.Rect start, androidx.ui.geometry.Rect stop, float fraction);
}
- public class Size implements androidx.ui.geometry.OffsetBase {
- ctor public Size(float width, float height);
- method public final androidx.ui.geometry.Offset bottomCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset center(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerRight(androidx.ui.geometry.Offset origin);
- method public final boolean contains(androidx.ui.geometry.Offset offset);
- method public final operator androidx.ui.geometry.Size div(float operand);
- method public float getDx();
- method public float getDy();
- method public final androidx.ui.geometry.Size getFlipped();
- method public final float getHeight();
- method public final float getLongestSide();
- method public final float getShortestSide();
- method public final float getWidth();
- method public final boolean isEmpty();
- method public final operator androidx.ui.geometry.Size minus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Size other);
- method public final operator androidx.ui.geometry.Size plus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Size rem(float operand);
- method public final operator androidx.ui.geometry.Size times(float operand);
- method public final androidx.ui.geometry.Offset topCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Size truncDiv(float operand);
- property public float dx;
- property public float dy;
+ public final inline class Size {
+ ctor public Size();
+ method public static long bottomCenter-RIqb49o(long $this, long origin);
+ method public static long bottomLeft-RIqb49o(long $this, long origin);
+ method public static long bottomRight-RIqb49o(long $this, long origin);
+ method public static long center-RIqb49o(long $this, long origin);
+ method public static long centerLeft-RIqb49o(long $this, long origin);
+ method public static long centerRight-RIqb49o(long $this, long origin);
+ method public static long constructor-impl(internal long value);
+ method public static boolean contains-RIqb49o(long $this, long offset);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static long getFlipped-impl(long $this);
+ method public static float getHeight-impl(long $this);
+ method public static float getMaxDimension-impl(long $this);
+ method public static float getMinDimension-impl(long $this);
+ method public static float getWidth-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static boolean isEmpty-impl(long $this);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long minus-b2zCL34(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long topCenter-RIqb49o(long $this, long origin);
+ method public static long topLeft-RIqb49o(long $this, long origin);
+ method public static long topRight-RIqb49o(long $this, long origin);
+ method public static long truncDiv-impl(long $this, float operand);
field public static final androidx.ui.geometry.Size.Companion! Companion;
}
public static final class Size.Companion {
- method public androidx.ui.geometry.Size copy(androidx.ui.geometry.Size source);
- method public androidx.ui.geometry.Size fromHeight(float height);
- method public androidx.ui.geometry.Size fromRadius(float radius);
- method public androidx.ui.geometry.Size fromWidth(float width);
- method public androidx.ui.geometry.Size getInfinite();
- method public androidx.ui.geometry.Size getZero();
- method public androidx.ui.geometry.Size? lerp(androidx.ui.geometry.Size start, androidx.ui.geometry.Size stop, float fraction);
- method public androidx.ui.geometry.Size square(float dimension);
- property public final androidx.ui.geometry.Size infinite;
- property public final androidx.ui.geometry.Size zero;
+ method public long copy-b2zCL34(long source);
+ method public long fromHeight(float height);
+ method public long fromRadius(float radius);
+ method public long fromWidth(float width);
+ method public long getInfinite();
+ method public long getZero();
+ method public androidx.ui.geometry.Size? lerp-T-c3OIQ(long start, long stop, float fraction);
+ method public long square(float dimension);
+ property public final long infinite;
+ property public final long zero;
+ }
+
+ public final class SizeKt {
+ method public static long Size(float width, float height);
}
}
diff --git a/ui/ui-geometry/api/current.txt b/ui/ui-geometry/api/current.txt
index 4ad12c3..390ba95 100644
--- a/ui/ui-geometry/api/current.txt
+++ b/ui/ui-geometry/api/current.txt
@@ -1,36 +1,38 @@
// Signature format: 3.0
package androidx.ui.geometry {
- public final class Offset implements androidx.ui.geometry.OffsetBase {
- ctor public Offset(float dx, float dy);
- method public infix androidx.ui.geometry.Rect and(androidx.ui.geometry.Size other);
- method public float component1();
- method public float component2();
- method public androidx.ui.geometry.Offset copy(float dx, float dy);
- method public operator androidx.ui.geometry.Offset div(float operand);
- method public float getDirection();
- method public float getDistance();
- method public float getDistanceSquared();
- method public float getDx();
- method public float getDy();
- method public operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset plus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset rem(float operand);
- method public androidx.ui.geometry.Offset scale(float scaleX, float scaleY);
- method public operator androidx.ui.geometry.Offset times(float operand);
- method public androidx.ui.geometry.Offset translate(float translateX, float translateY);
- method public androidx.ui.geometry.Offset truncDiv(float operand);
- method public operator androidx.ui.geometry.Offset unaryMinus();
+ public final inline class Offset {
+ ctor public Offset();
+ method public static infix androidx.ui.geometry.Rect and-b2zCL34(long $this, long other);
+ method public static long constructor-impl(internal long packedValue);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static float getDirection-impl(long $this);
+ method public static float getDistance-impl(long $this);
+ method public static float getDistanceSquared-impl(long $this);
+ method public static float getDx-impl(long $this);
+ method public static float getDy-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static long scale-impl(long $this, float scaleX, float scaleY);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long translate-impl(long $this, float translateX, float translateY);
+ method public static long truncDiv-impl(long $this, float operand);
+ method public static operator long unaryMinus-impl(long $this);
field public static final androidx.ui.geometry.Offset.Companion! Companion;
}
public static final class Offset.Companion {
- method public androidx.ui.geometry.Offset getInfinite();
- method public androidx.ui.geometry.Offset getZero();
- method public boolean isValid(androidx.ui.geometry.Offset offset);
- method public androidx.ui.geometry.Offset lerp(androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset stop, float fraction);
- property public final androidx.ui.geometry.Offset infinite;
- property public final androidx.ui.geometry.Offset zero;
+ method public long getInfinite();
+ method public long getZero();
+ method public boolean isValid-RIqb49o(long offset);
+ method public long lerp-nqy8KaQ(long start, long stop, float fraction);
+ property public final long infinite;
+ property public final long zero;
}
public interface OffsetBase {
@@ -46,6 +48,10 @@
property public abstract float dy;
}
+ public final class OffsetKt {
+ method public static long Offset(float dx, float dy);
+ }
+
public final class RRect {
ctor public RRect(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method public float component1();
@@ -60,7 +66,7 @@
method public float component7();
method public float component8();
method public float component9();
- method public boolean contains(androidx.ui.geometry.Offset point);
+ method public boolean contains-RIqb49o(long point);
method public androidx.ui.geometry.RRect copy(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method @Deprecated public androidx.ui.geometry.RRect deflate(float delta);
method public float getBottom();
@@ -98,7 +104,7 @@
method public static androidx.ui.geometry.RRect RRect(androidx.ui.geometry.Rect rect, androidx.ui.geometry.Radius topLeft = Radius.zero, androidx.ui.geometry.Radius topRight = Radius.zero, androidx.ui.geometry.Radius bottomRight = Radius.zero, androidx.ui.geometry.Radius bottomLeft = Radius.zero);
method public static androidx.ui.geometry.Radius bottomLeftRadius(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius bottomRightRadius(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.Offset center(androidx.ui.geometry.RRect);
+ method public static long center(androidx.ui.geometry.RRect);
method public static float getLongestSide(androidx.ui.geometry.RRect);
method public static float getShortestSide(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.RRect grow(androidx.ui.geometry.RRect, float delta);
@@ -113,7 +119,7 @@
method public static androidx.ui.geometry.Rect middleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect outerRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect safeInnerRect(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.RRect shift(androidx.ui.geometry.RRect, androidx.ui.geometry.Offset offset);
+ method public static androidx.ui.geometry.RRect shift-q6ZkaaM(androidx.ui.geometry.RRect, long offset);
method public static androidx.ui.geometry.RRect shrink(androidx.ui.geometry.RRect, float delta);
method public static androidx.ui.geometry.Rect tallMiddleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius topLeftRadius(androidx.ui.geometry.RRect);
@@ -156,27 +162,27 @@
method public float component2();
method public float component3();
method public float component4();
- method public boolean contains(androidx.ui.geometry.Offset offset);
+ method public boolean contains-RIqb49o(long offset);
method public androidx.ui.geometry.Rect copy(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect deflate(float delta);
method public androidx.ui.geometry.Rect expandToInclude(androidx.ui.geometry.Rect other);
method public float getBottom();
- method public androidx.ui.geometry.Offset getBottomCenter();
- method public androidx.ui.geometry.Offset getBottomLeft();
- method public androidx.ui.geometry.Offset getBottomRight();
- method public androidx.ui.geometry.Offset getCenter();
- method public androidx.ui.geometry.Offset getCenterLeft();
- method public androidx.ui.geometry.Offset getCenterRight();
+ method public long getBottomCenter();
+ method public long getBottomLeft();
+ method public long getBottomRight();
+ method public long getCenter();
+ method public long getCenterLeft();
+ method public long getCenterRight();
method public float getHeight();
method public float getLeft();
- method public float getLongestSide();
+ method public float getMaxDimension();
+ method public float getMinDimension();
method public float getRight();
- method public float getShortestSide();
- method public androidx.ui.geometry.Size getSize();
+ method public long getSize();
method public float getTop();
- method public androidx.ui.geometry.Offset getTopCenter();
- method public androidx.ui.geometry.Offset getTopLeft();
- method public androidx.ui.geometry.Offset getTopRight();
+ method public long getTopCenter();
+ method public long getTopLeft();
+ method public long getTopRight();
method public float getWidth();
method public androidx.ui.geometry.Rect inflate(float delta);
method public androidx.ui.geometry.Rect intersect(androidx.ui.geometry.Rect other);
@@ -185,18 +191,20 @@
method public boolean isInfinite();
method public androidx.ui.geometry.Rect join(androidx.ui.geometry.Rect other);
method public boolean overlaps(androidx.ui.geometry.Rect other);
- method public androidx.ui.geometry.Rect shift(androidx.ui.geometry.Offset offset);
+ method public androidx.ui.geometry.Rect shift-RIqb49o(long offset);
method public androidx.ui.geometry.Rect translate(float translateX, float translateY);
property public final float height;
+ property public final float maxDimension;
+ property public final float minDimension;
property public final float width;
field public static final androidx.ui.geometry.Rect.Companion! Companion;
}
public static final class Rect.Companion {
- method public androidx.ui.geometry.Rect fromCircle(androidx.ui.geometry.Offset center, float radius);
+ method public androidx.ui.geometry.Rect fromCircle-hSKLB2U(long center, float radius);
method public androidx.ui.geometry.Rect fromLTRB(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect fromLTWH(float left, float top, float width, float height);
- method public androidx.ui.geometry.Rect fromPoints(androidx.ui.geometry.Offset a, androidx.ui.geometry.Offset b);
+ method public androidx.ui.geometry.Rect fromPoints-cs1Rg_A(long a, long b);
method public androidx.ui.geometry.Rect getLargest();
method public androidx.ui.geometry.Rect getZero();
method public float get_giantScalar();
@@ -209,49 +217,54 @@
method public static androidx.ui.geometry.Rect lerp(androidx.ui.geometry.Rect start, androidx.ui.geometry.Rect stop, float fraction);
}
- public class Size implements androidx.ui.geometry.OffsetBase {
- ctor public Size(float width, float height);
- method public final androidx.ui.geometry.Offset bottomCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset center(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerRight(androidx.ui.geometry.Offset origin);
- method public final boolean contains(androidx.ui.geometry.Offset offset);
- method public final operator androidx.ui.geometry.Size div(float operand);
- method public float getDx();
- method public float getDy();
- method public final androidx.ui.geometry.Size getFlipped();
- method public final float getHeight();
- method public final float getLongestSide();
- method public final float getShortestSide();
- method public final float getWidth();
- method public final boolean isEmpty();
- method public final operator androidx.ui.geometry.Size minus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Size other);
- method public final operator androidx.ui.geometry.Size plus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Size rem(float operand);
- method public final operator androidx.ui.geometry.Size times(float operand);
- method public final androidx.ui.geometry.Offset topCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Size truncDiv(float operand);
- property public float dx;
- property public float dy;
+ public final inline class Size {
+ ctor public Size();
+ method public static long bottomCenter-RIqb49o(long $this, long origin);
+ method public static long bottomLeft-RIqb49o(long $this, long origin);
+ method public static long bottomRight-RIqb49o(long $this, long origin);
+ method public static long center-RIqb49o(long $this, long origin);
+ method public static long centerLeft-RIqb49o(long $this, long origin);
+ method public static long centerRight-RIqb49o(long $this, long origin);
+ method public static long constructor-impl(internal long value);
+ method public static boolean contains-RIqb49o(long $this, long offset);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static long getFlipped-impl(long $this);
+ method public static float getHeight-impl(long $this);
+ method public static float getMaxDimension-impl(long $this);
+ method public static float getMinDimension-impl(long $this);
+ method public static float getWidth-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static boolean isEmpty-impl(long $this);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long minus-b2zCL34(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long topCenter-RIqb49o(long $this, long origin);
+ method public static long topLeft-RIqb49o(long $this, long origin);
+ method public static long topRight-RIqb49o(long $this, long origin);
+ method public static long truncDiv-impl(long $this, float operand);
field public static final androidx.ui.geometry.Size.Companion! Companion;
}
public static final class Size.Companion {
- method public androidx.ui.geometry.Size copy(androidx.ui.geometry.Size source);
- method public androidx.ui.geometry.Size fromHeight(float height);
- method public androidx.ui.geometry.Size fromRadius(float radius);
- method public androidx.ui.geometry.Size fromWidth(float width);
- method public androidx.ui.geometry.Size getInfinite();
- method public androidx.ui.geometry.Size getZero();
- method public androidx.ui.geometry.Size? lerp(androidx.ui.geometry.Size start, androidx.ui.geometry.Size stop, float fraction);
- method public androidx.ui.geometry.Size square(float dimension);
- property public final androidx.ui.geometry.Size infinite;
- property public final androidx.ui.geometry.Size zero;
+ method public long copy-b2zCL34(long source);
+ method public long fromHeight(float height);
+ method public long fromRadius(float radius);
+ method public long fromWidth(float width);
+ method public long getInfinite();
+ method public long getZero();
+ method public androidx.ui.geometry.Size? lerp-T-c3OIQ(long start, long stop, float fraction);
+ method public long square(float dimension);
+ property public final long infinite;
+ property public final long zero;
+ }
+
+ public final class SizeKt {
+ method public static long Size(float width, float height);
}
}
diff --git a/ui/ui-geometry/api/public_plus_experimental_0.1.0-dev11.txt b/ui/ui-geometry/api/public_plus_experimental_0.1.0-dev11.txt
index 4ad12c3..390ba95 100644
--- a/ui/ui-geometry/api/public_plus_experimental_0.1.0-dev11.txt
+++ b/ui/ui-geometry/api/public_plus_experimental_0.1.0-dev11.txt
@@ -1,36 +1,38 @@
// Signature format: 3.0
package androidx.ui.geometry {
- public final class Offset implements androidx.ui.geometry.OffsetBase {
- ctor public Offset(float dx, float dy);
- method public infix androidx.ui.geometry.Rect and(androidx.ui.geometry.Size other);
- method public float component1();
- method public float component2();
- method public androidx.ui.geometry.Offset copy(float dx, float dy);
- method public operator androidx.ui.geometry.Offset div(float operand);
- method public float getDirection();
- method public float getDistance();
- method public float getDistanceSquared();
- method public float getDx();
- method public float getDy();
- method public operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset plus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset rem(float operand);
- method public androidx.ui.geometry.Offset scale(float scaleX, float scaleY);
- method public operator androidx.ui.geometry.Offset times(float operand);
- method public androidx.ui.geometry.Offset translate(float translateX, float translateY);
- method public androidx.ui.geometry.Offset truncDiv(float operand);
- method public operator androidx.ui.geometry.Offset unaryMinus();
+ public final inline class Offset {
+ ctor public Offset();
+ method public static infix androidx.ui.geometry.Rect and-b2zCL34(long $this, long other);
+ method public static long constructor-impl(internal long packedValue);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static float getDirection-impl(long $this);
+ method public static float getDistance-impl(long $this);
+ method public static float getDistanceSquared-impl(long $this);
+ method public static float getDx-impl(long $this);
+ method public static float getDy-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static long scale-impl(long $this, float scaleX, float scaleY);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long translate-impl(long $this, float translateX, float translateY);
+ method public static long truncDiv-impl(long $this, float operand);
+ method public static operator long unaryMinus-impl(long $this);
field public static final androidx.ui.geometry.Offset.Companion! Companion;
}
public static final class Offset.Companion {
- method public androidx.ui.geometry.Offset getInfinite();
- method public androidx.ui.geometry.Offset getZero();
- method public boolean isValid(androidx.ui.geometry.Offset offset);
- method public androidx.ui.geometry.Offset lerp(androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset stop, float fraction);
- property public final androidx.ui.geometry.Offset infinite;
- property public final androidx.ui.geometry.Offset zero;
+ method public long getInfinite();
+ method public long getZero();
+ method public boolean isValid-RIqb49o(long offset);
+ method public long lerp-nqy8KaQ(long start, long stop, float fraction);
+ property public final long infinite;
+ property public final long zero;
}
public interface OffsetBase {
@@ -46,6 +48,10 @@
property public abstract float dy;
}
+ public final class OffsetKt {
+ method public static long Offset(float dx, float dy);
+ }
+
public final class RRect {
ctor public RRect(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method public float component1();
@@ -60,7 +66,7 @@
method public float component7();
method public float component8();
method public float component9();
- method public boolean contains(androidx.ui.geometry.Offset point);
+ method public boolean contains-RIqb49o(long point);
method public androidx.ui.geometry.RRect copy(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method @Deprecated public androidx.ui.geometry.RRect deflate(float delta);
method public float getBottom();
@@ -98,7 +104,7 @@
method public static androidx.ui.geometry.RRect RRect(androidx.ui.geometry.Rect rect, androidx.ui.geometry.Radius topLeft = Radius.zero, androidx.ui.geometry.Radius topRight = Radius.zero, androidx.ui.geometry.Radius bottomRight = Radius.zero, androidx.ui.geometry.Radius bottomLeft = Radius.zero);
method public static androidx.ui.geometry.Radius bottomLeftRadius(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius bottomRightRadius(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.Offset center(androidx.ui.geometry.RRect);
+ method public static long center(androidx.ui.geometry.RRect);
method public static float getLongestSide(androidx.ui.geometry.RRect);
method public static float getShortestSide(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.RRect grow(androidx.ui.geometry.RRect, float delta);
@@ -113,7 +119,7 @@
method public static androidx.ui.geometry.Rect middleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect outerRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect safeInnerRect(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.RRect shift(androidx.ui.geometry.RRect, androidx.ui.geometry.Offset offset);
+ method public static androidx.ui.geometry.RRect shift-q6ZkaaM(androidx.ui.geometry.RRect, long offset);
method public static androidx.ui.geometry.RRect shrink(androidx.ui.geometry.RRect, float delta);
method public static androidx.ui.geometry.Rect tallMiddleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius topLeftRadius(androidx.ui.geometry.RRect);
@@ -156,27 +162,27 @@
method public float component2();
method public float component3();
method public float component4();
- method public boolean contains(androidx.ui.geometry.Offset offset);
+ method public boolean contains-RIqb49o(long offset);
method public androidx.ui.geometry.Rect copy(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect deflate(float delta);
method public androidx.ui.geometry.Rect expandToInclude(androidx.ui.geometry.Rect other);
method public float getBottom();
- method public androidx.ui.geometry.Offset getBottomCenter();
- method public androidx.ui.geometry.Offset getBottomLeft();
- method public androidx.ui.geometry.Offset getBottomRight();
- method public androidx.ui.geometry.Offset getCenter();
- method public androidx.ui.geometry.Offset getCenterLeft();
- method public androidx.ui.geometry.Offset getCenterRight();
+ method public long getBottomCenter();
+ method public long getBottomLeft();
+ method public long getBottomRight();
+ method public long getCenter();
+ method public long getCenterLeft();
+ method public long getCenterRight();
method public float getHeight();
method public float getLeft();
- method public float getLongestSide();
+ method public float getMaxDimension();
+ method public float getMinDimension();
method public float getRight();
- method public float getShortestSide();
- method public androidx.ui.geometry.Size getSize();
+ method public long getSize();
method public float getTop();
- method public androidx.ui.geometry.Offset getTopCenter();
- method public androidx.ui.geometry.Offset getTopLeft();
- method public androidx.ui.geometry.Offset getTopRight();
+ method public long getTopCenter();
+ method public long getTopLeft();
+ method public long getTopRight();
method public float getWidth();
method public androidx.ui.geometry.Rect inflate(float delta);
method public androidx.ui.geometry.Rect intersect(androidx.ui.geometry.Rect other);
@@ -185,18 +191,20 @@
method public boolean isInfinite();
method public androidx.ui.geometry.Rect join(androidx.ui.geometry.Rect other);
method public boolean overlaps(androidx.ui.geometry.Rect other);
- method public androidx.ui.geometry.Rect shift(androidx.ui.geometry.Offset offset);
+ method public androidx.ui.geometry.Rect shift-RIqb49o(long offset);
method public androidx.ui.geometry.Rect translate(float translateX, float translateY);
property public final float height;
+ property public final float maxDimension;
+ property public final float minDimension;
property public final float width;
field public static final androidx.ui.geometry.Rect.Companion! Companion;
}
public static final class Rect.Companion {
- method public androidx.ui.geometry.Rect fromCircle(androidx.ui.geometry.Offset center, float radius);
+ method public androidx.ui.geometry.Rect fromCircle-hSKLB2U(long center, float radius);
method public androidx.ui.geometry.Rect fromLTRB(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect fromLTWH(float left, float top, float width, float height);
- method public androidx.ui.geometry.Rect fromPoints(androidx.ui.geometry.Offset a, androidx.ui.geometry.Offset b);
+ method public androidx.ui.geometry.Rect fromPoints-cs1Rg_A(long a, long b);
method public androidx.ui.geometry.Rect getLargest();
method public androidx.ui.geometry.Rect getZero();
method public float get_giantScalar();
@@ -209,49 +217,54 @@
method public static androidx.ui.geometry.Rect lerp(androidx.ui.geometry.Rect start, androidx.ui.geometry.Rect stop, float fraction);
}
- public class Size implements androidx.ui.geometry.OffsetBase {
- ctor public Size(float width, float height);
- method public final androidx.ui.geometry.Offset bottomCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset center(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerRight(androidx.ui.geometry.Offset origin);
- method public final boolean contains(androidx.ui.geometry.Offset offset);
- method public final operator androidx.ui.geometry.Size div(float operand);
- method public float getDx();
- method public float getDy();
- method public final androidx.ui.geometry.Size getFlipped();
- method public final float getHeight();
- method public final float getLongestSide();
- method public final float getShortestSide();
- method public final float getWidth();
- method public final boolean isEmpty();
- method public final operator androidx.ui.geometry.Size minus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Size other);
- method public final operator androidx.ui.geometry.Size plus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Size rem(float operand);
- method public final operator androidx.ui.geometry.Size times(float operand);
- method public final androidx.ui.geometry.Offset topCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Size truncDiv(float operand);
- property public float dx;
- property public float dy;
+ public final inline class Size {
+ ctor public Size();
+ method public static long bottomCenter-RIqb49o(long $this, long origin);
+ method public static long bottomLeft-RIqb49o(long $this, long origin);
+ method public static long bottomRight-RIqb49o(long $this, long origin);
+ method public static long center-RIqb49o(long $this, long origin);
+ method public static long centerLeft-RIqb49o(long $this, long origin);
+ method public static long centerRight-RIqb49o(long $this, long origin);
+ method public static long constructor-impl(internal long value);
+ method public static boolean contains-RIqb49o(long $this, long offset);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static long getFlipped-impl(long $this);
+ method public static float getHeight-impl(long $this);
+ method public static float getMaxDimension-impl(long $this);
+ method public static float getMinDimension-impl(long $this);
+ method public static float getWidth-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static boolean isEmpty-impl(long $this);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long minus-b2zCL34(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long topCenter-RIqb49o(long $this, long origin);
+ method public static long topLeft-RIqb49o(long $this, long origin);
+ method public static long topRight-RIqb49o(long $this, long origin);
+ method public static long truncDiv-impl(long $this, float operand);
field public static final androidx.ui.geometry.Size.Companion! Companion;
}
public static final class Size.Companion {
- method public androidx.ui.geometry.Size copy(androidx.ui.geometry.Size source);
- method public androidx.ui.geometry.Size fromHeight(float height);
- method public androidx.ui.geometry.Size fromRadius(float radius);
- method public androidx.ui.geometry.Size fromWidth(float width);
- method public androidx.ui.geometry.Size getInfinite();
- method public androidx.ui.geometry.Size getZero();
- method public androidx.ui.geometry.Size? lerp(androidx.ui.geometry.Size start, androidx.ui.geometry.Size stop, float fraction);
- method public androidx.ui.geometry.Size square(float dimension);
- property public final androidx.ui.geometry.Size infinite;
- property public final androidx.ui.geometry.Size zero;
+ method public long copy-b2zCL34(long source);
+ method public long fromHeight(float height);
+ method public long fromRadius(float radius);
+ method public long fromWidth(float width);
+ method public long getInfinite();
+ method public long getZero();
+ method public androidx.ui.geometry.Size? lerp-T-c3OIQ(long start, long stop, float fraction);
+ method public long square(float dimension);
+ property public final long infinite;
+ property public final long zero;
+ }
+
+ public final class SizeKt {
+ method public static long Size(float width, float height);
}
}
diff --git a/ui/ui-geometry/api/public_plus_experimental_current.txt b/ui/ui-geometry/api/public_plus_experimental_current.txt
index 4ad12c3..390ba95 100644
--- a/ui/ui-geometry/api/public_plus_experimental_current.txt
+++ b/ui/ui-geometry/api/public_plus_experimental_current.txt
@@ -1,36 +1,38 @@
// Signature format: 3.0
package androidx.ui.geometry {
- public final class Offset implements androidx.ui.geometry.OffsetBase {
- ctor public Offset(float dx, float dy);
- method public infix androidx.ui.geometry.Rect and(androidx.ui.geometry.Size other);
- method public float component1();
- method public float component2();
- method public androidx.ui.geometry.Offset copy(float dx, float dy);
- method public operator androidx.ui.geometry.Offset div(float operand);
- method public float getDirection();
- method public float getDistance();
- method public float getDistanceSquared();
- method public float getDx();
- method public float getDy();
- method public operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset plus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset rem(float operand);
- method public androidx.ui.geometry.Offset scale(float scaleX, float scaleY);
- method public operator androidx.ui.geometry.Offset times(float operand);
- method public androidx.ui.geometry.Offset translate(float translateX, float translateY);
- method public androidx.ui.geometry.Offset truncDiv(float operand);
- method public operator androidx.ui.geometry.Offset unaryMinus();
+ public final inline class Offset {
+ ctor public Offset();
+ method public static infix androidx.ui.geometry.Rect and-b2zCL34(long $this, long other);
+ method public static long constructor-impl(internal long packedValue);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static float getDirection-impl(long $this);
+ method public static float getDistance-impl(long $this);
+ method public static float getDistanceSquared-impl(long $this);
+ method public static float getDx-impl(long $this);
+ method public static float getDy-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static long scale-impl(long $this, float scaleX, float scaleY);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long translate-impl(long $this, float translateX, float translateY);
+ method public static long truncDiv-impl(long $this, float operand);
+ method public static operator long unaryMinus-impl(long $this);
field public static final androidx.ui.geometry.Offset.Companion! Companion;
}
public static final class Offset.Companion {
- method public androidx.ui.geometry.Offset getInfinite();
- method public androidx.ui.geometry.Offset getZero();
- method public boolean isValid(androidx.ui.geometry.Offset offset);
- method public androidx.ui.geometry.Offset lerp(androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset stop, float fraction);
- property public final androidx.ui.geometry.Offset infinite;
- property public final androidx.ui.geometry.Offset zero;
+ method public long getInfinite();
+ method public long getZero();
+ method public boolean isValid-RIqb49o(long offset);
+ method public long lerp-nqy8KaQ(long start, long stop, float fraction);
+ property public final long infinite;
+ property public final long zero;
}
public interface OffsetBase {
@@ -46,6 +48,10 @@
property public abstract float dy;
}
+ public final class OffsetKt {
+ method public static long Offset(float dx, float dy);
+ }
+
public final class RRect {
ctor public RRect(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method public float component1();
@@ -60,7 +66,7 @@
method public float component7();
method public float component8();
method public float component9();
- method public boolean contains(androidx.ui.geometry.Offset point);
+ method public boolean contains-RIqb49o(long point);
method public androidx.ui.geometry.RRect copy(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method @Deprecated public androidx.ui.geometry.RRect deflate(float delta);
method public float getBottom();
@@ -98,7 +104,7 @@
method public static androidx.ui.geometry.RRect RRect(androidx.ui.geometry.Rect rect, androidx.ui.geometry.Radius topLeft = Radius.zero, androidx.ui.geometry.Radius topRight = Radius.zero, androidx.ui.geometry.Radius bottomRight = Radius.zero, androidx.ui.geometry.Radius bottomLeft = Radius.zero);
method public static androidx.ui.geometry.Radius bottomLeftRadius(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius bottomRightRadius(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.Offset center(androidx.ui.geometry.RRect);
+ method public static long center(androidx.ui.geometry.RRect);
method public static float getLongestSide(androidx.ui.geometry.RRect);
method public static float getShortestSide(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.RRect grow(androidx.ui.geometry.RRect, float delta);
@@ -113,7 +119,7 @@
method public static androidx.ui.geometry.Rect middleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect outerRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect safeInnerRect(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.RRect shift(androidx.ui.geometry.RRect, androidx.ui.geometry.Offset offset);
+ method public static androidx.ui.geometry.RRect shift-q6ZkaaM(androidx.ui.geometry.RRect, long offset);
method public static androidx.ui.geometry.RRect shrink(androidx.ui.geometry.RRect, float delta);
method public static androidx.ui.geometry.Rect tallMiddleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius topLeftRadius(androidx.ui.geometry.RRect);
@@ -156,27 +162,27 @@
method public float component2();
method public float component3();
method public float component4();
- method public boolean contains(androidx.ui.geometry.Offset offset);
+ method public boolean contains-RIqb49o(long offset);
method public androidx.ui.geometry.Rect copy(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect deflate(float delta);
method public androidx.ui.geometry.Rect expandToInclude(androidx.ui.geometry.Rect other);
method public float getBottom();
- method public androidx.ui.geometry.Offset getBottomCenter();
- method public androidx.ui.geometry.Offset getBottomLeft();
- method public androidx.ui.geometry.Offset getBottomRight();
- method public androidx.ui.geometry.Offset getCenter();
- method public androidx.ui.geometry.Offset getCenterLeft();
- method public androidx.ui.geometry.Offset getCenterRight();
+ method public long getBottomCenter();
+ method public long getBottomLeft();
+ method public long getBottomRight();
+ method public long getCenter();
+ method public long getCenterLeft();
+ method public long getCenterRight();
method public float getHeight();
method public float getLeft();
- method public float getLongestSide();
+ method public float getMaxDimension();
+ method public float getMinDimension();
method public float getRight();
- method public float getShortestSide();
- method public androidx.ui.geometry.Size getSize();
+ method public long getSize();
method public float getTop();
- method public androidx.ui.geometry.Offset getTopCenter();
- method public androidx.ui.geometry.Offset getTopLeft();
- method public androidx.ui.geometry.Offset getTopRight();
+ method public long getTopCenter();
+ method public long getTopLeft();
+ method public long getTopRight();
method public float getWidth();
method public androidx.ui.geometry.Rect inflate(float delta);
method public androidx.ui.geometry.Rect intersect(androidx.ui.geometry.Rect other);
@@ -185,18 +191,20 @@
method public boolean isInfinite();
method public androidx.ui.geometry.Rect join(androidx.ui.geometry.Rect other);
method public boolean overlaps(androidx.ui.geometry.Rect other);
- method public androidx.ui.geometry.Rect shift(androidx.ui.geometry.Offset offset);
+ method public androidx.ui.geometry.Rect shift-RIqb49o(long offset);
method public androidx.ui.geometry.Rect translate(float translateX, float translateY);
property public final float height;
+ property public final float maxDimension;
+ property public final float minDimension;
property public final float width;
field public static final androidx.ui.geometry.Rect.Companion! Companion;
}
public static final class Rect.Companion {
- method public androidx.ui.geometry.Rect fromCircle(androidx.ui.geometry.Offset center, float radius);
+ method public androidx.ui.geometry.Rect fromCircle-hSKLB2U(long center, float radius);
method public androidx.ui.geometry.Rect fromLTRB(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect fromLTWH(float left, float top, float width, float height);
- method public androidx.ui.geometry.Rect fromPoints(androidx.ui.geometry.Offset a, androidx.ui.geometry.Offset b);
+ method public androidx.ui.geometry.Rect fromPoints-cs1Rg_A(long a, long b);
method public androidx.ui.geometry.Rect getLargest();
method public androidx.ui.geometry.Rect getZero();
method public float get_giantScalar();
@@ -209,49 +217,54 @@
method public static androidx.ui.geometry.Rect lerp(androidx.ui.geometry.Rect start, androidx.ui.geometry.Rect stop, float fraction);
}
- public class Size implements androidx.ui.geometry.OffsetBase {
- ctor public Size(float width, float height);
- method public final androidx.ui.geometry.Offset bottomCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset center(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerRight(androidx.ui.geometry.Offset origin);
- method public final boolean contains(androidx.ui.geometry.Offset offset);
- method public final operator androidx.ui.geometry.Size div(float operand);
- method public float getDx();
- method public float getDy();
- method public final androidx.ui.geometry.Size getFlipped();
- method public final float getHeight();
- method public final float getLongestSide();
- method public final float getShortestSide();
- method public final float getWidth();
- method public final boolean isEmpty();
- method public final operator androidx.ui.geometry.Size minus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Size other);
- method public final operator androidx.ui.geometry.Size plus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Size rem(float operand);
- method public final operator androidx.ui.geometry.Size times(float operand);
- method public final androidx.ui.geometry.Offset topCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Size truncDiv(float operand);
- property public float dx;
- property public float dy;
+ public final inline class Size {
+ ctor public Size();
+ method public static long bottomCenter-RIqb49o(long $this, long origin);
+ method public static long bottomLeft-RIqb49o(long $this, long origin);
+ method public static long bottomRight-RIqb49o(long $this, long origin);
+ method public static long center-RIqb49o(long $this, long origin);
+ method public static long centerLeft-RIqb49o(long $this, long origin);
+ method public static long centerRight-RIqb49o(long $this, long origin);
+ method public static long constructor-impl(internal long value);
+ method public static boolean contains-RIqb49o(long $this, long offset);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static long getFlipped-impl(long $this);
+ method public static float getHeight-impl(long $this);
+ method public static float getMaxDimension-impl(long $this);
+ method public static float getMinDimension-impl(long $this);
+ method public static float getWidth-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static boolean isEmpty-impl(long $this);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long minus-b2zCL34(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long topCenter-RIqb49o(long $this, long origin);
+ method public static long topLeft-RIqb49o(long $this, long origin);
+ method public static long topRight-RIqb49o(long $this, long origin);
+ method public static long truncDiv-impl(long $this, float operand);
field public static final androidx.ui.geometry.Size.Companion! Companion;
}
public static final class Size.Companion {
- method public androidx.ui.geometry.Size copy(androidx.ui.geometry.Size source);
- method public androidx.ui.geometry.Size fromHeight(float height);
- method public androidx.ui.geometry.Size fromRadius(float radius);
- method public androidx.ui.geometry.Size fromWidth(float width);
- method public androidx.ui.geometry.Size getInfinite();
- method public androidx.ui.geometry.Size getZero();
- method public androidx.ui.geometry.Size? lerp(androidx.ui.geometry.Size start, androidx.ui.geometry.Size stop, float fraction);
- method public androidx.ui.geometry.Size square(float dimension);
- property public final androidx.ui.geometry.Size infinite;
- property public final androidx.ui.geometry.Size zero;
+ method public long copy-b2zCL34(long source);
+ method public long fromHeight(float height);
+ method public long fromRadius(float radius);
+ method public long fromWidth(float width);
+ method public long getInfinite();
+ method public long getZero();
+ method public androidx.ui.geometry.Size? lerp-T-c3OIQ(long start, long stop, float fraction);
+ method public long square(float dimension);
+ property public final long infinite;
+ property public final long zero;
+ }
+
+ public final class SizeKt {
+ method public static long Size(float width, float height);
}
}
diff --git a/ui/ui-geometry/api/restricted_0.1.0-dev11.txt b/ui/ui-geometry/api/restricted_0.1.0-dev11.txt
index 4ad12c3..390ba95 100644
--- a/ui/ui-geometry/api/restricted_0.1.0-dev11.txt
+++ b/ui/ui-geometry/api/restricted_0.1.0-dev11.txt
@@ -1,36 +1,38 @@
// Signature format: 3.0
package androidx.ui.geometry {
- public final class Offset implements androidx.ui.geometry.OffsetBase {
- ctor public Offset(float dx, float dy);
- method public infix androidx.ui.geometry.Rect and(androidx.ui.geometry.Size other);
- method public float component1();
- method public float component2();
- method public androidx.ui.geometry.Offset copy(float dx, float dy);
- method public operator androidx.ui.geometry.Offset div(float operand);
- method public float getDirection();
- method public float getDistance();
- method public float getDistanceSquared();
- method public float getDx();
- method public float getDy();
- method public operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset plus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset rem(float operand);
- method public androidx.ui.geometry.Offset scale(float scaleX, float scaleY);
- method public operator androidx.ui.geometry.Offset times(float operand);
- method public androidx.ui.geometry.Offset translate(float translateX, float translateY);
- method public androidx.ui.geometry.Offset truncDiv(float operand);
- method public operator androidx.ui.geometry.Offset unaryMinus();
+ public final inline class Offset {
+ ctor public Offset();
+ method public static infix androidx.ui.geometry.Rect and-b2zCL34(long $this, long other);
+ method public static long constructor-impl(internal long packedValue);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static float getDirection-impl(long $this);
+ method public static float getDistance-impl(long $this);
+ method public static float getDistanceSquared-impl(long $this);
+ method public static float getDx-impl(long $this);
+ method public static float getDy-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static long scale-impl(long $this, float scaleX, float scaleY);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long translate-impl(long $this, float translateX, float translateY);
+ method public static long truncDiv-impl(long $this, float operand);
+ method public static operator long unaryMinus-impl(long $this);
field public static final androidx.ui.geometry.Offset.Companion! Companion;
}
public static final class Offset.Companion {
- method public androidx.ui.geometry.Offset getInfinite();
- method public androidx.ui.geometry.Offset getZero();
- method public boolean isValid(androidx.ui.geometry.Offset offset);
- method public androidx.ui.geometry.Offset lerp(androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset stop, float fraction);
- property public final androidx.ui.geometry.Offset infinite;
- property public final androidx.ui.geometry.Offset zero;
+ method public long getInfinite();
+ method public long getZero();
+ method public boolean isValid-RIqb49o(long offset);
+ method public long lerp-nqy8KaQ(long start, long stop, float fraction);
+ property public final long infinite;
+ property public final long zero;
}
public interface OffsetBase {
@@ -46,6 +48,10 @@
property public abstract float dy;
}
+ public final class OffsetKt {
+ method public static long Offset(float dx, float dy);
+ }
+
public final class RRect {
ctor public RRect(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method public float component1();
@@ -60,7 +66,7 @@
method public float component7();
method public float component8();
method public float component9();
- method public boolean contains(androidx.ui.geometry.Offset point);
+ method public boolean contains-RIqb49o(long point);
method public androidx.ui.geometry.RRect copy(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method @Deprecated public androidx.ui.geometry.RRect deflate(float delta);
method public float getBottom();
@@ -98,7 +104,7 @@
method public static androidx.ui.geometry.RRect RRect(androidx.ui.geometry.Rect rect, androidx.ui.geometry.Radius topLeft = Radius.zero, androidx.ui.geometry.Radius topRight = Radius.zero, androidx.ui.geometry.Radius bottomRight = Radius.zero, androidx.ui.geometry.Radius bottomLeft = Radius.zero);
method public static androidx.ui.geometry.Radius bottomLeftRadius(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius bottomRightRadius(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.Offset center(androidx.ui.geometry.RRect);
+ method public static long center(androidx.ui.geometry.RRect);
method public static float getLongestSide(androidx.ui.geometry.RRect);
method public static float getShortestSide(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.RRect grow(androidx.ui.geometry.RRect, float delta);
@@ -113,7 +119,7 @@
method public static androidx.ui.geometry.Rect middleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect outerRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect safeInnerRect(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.RRect shift(androidx.ui.geometry.RRect, androidx.ui.geometry.Offset offset);
+ method public static androidx.ui.geometry.RRect shift-q6ZkaaM(androidx.ui.geometry.RRect, long offset);
method public static androidx.ui.geometry.RRect shrink(androidx.ui.geometry.RRect, float delta);
method public static androidx.ui.geometry.Rect tallMiddleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius topLeftRadius(androidx.ui.geometry.RRect);
@@ -156,27 +162,27 @@
method public float component2();
method public float component3();
method public float component4();
- method public boolean contains(androidx.ui.geometry.Offset offset);
+ method public boolean contains-RIqb49o(long offset);
method public androidx.ui.geometry.Rect copy(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect deflate(float delta);
method public androidx.ui.geometry.Rect expandToInclude(androidx.ui.geometry.Rect other);
method public float getBottom();
- method public androidx.ui.geometry.Offset getBottomCenter();
- method public androidx.ui.geometry.Offset getBottomLeft();
- method public androidx.ui.geometry.Offset getBottomRight();
- method public androidx.ui.geometry.Offset getCenter();
- method public androidx.ui.geometry.Offset getCenterLeft();
- method public androidx.ui.geometry.Offset getCenterRight();
+ method public long getBottomCenter();
+ method public long getBottomLeft();
+ method public long getBottomRight();
+ method public long getCenter();
+ method public long getCenterLeft();
+ method public long getCenterRight();
method public float getHeight();
method public float getLeft();
- method public float getLongestSide();
+ method public float getMaxDimension();
+ method public float getMinDimension();
method public float getRight();
- method public float getShortestSide();
- method public androidx.ui.geometry.Size getSize();
+ method public long getSize();
method public float getTop();
- method public androidx.ui.geometry.Offset getTopCenter();
- method public androidx.ui.geometry.Offset getTopLeft();
- method public androidx.ui.geometry.Offset getTopRight();
+ method public long getTopCenter();
+ method public long getTopLeft();
+ method public long getTopRight();
method public float getWidth();
method public androidx.ui.geometry.Rect inflate(float delta);
method public androidx.ui.geometry.Rect intersect(androidx.ui.geometry.Rect other);
@@ -185,18 +191,20 @@
method public boolean isInfinite();
method public androidx.ui.geometry.Rect join(androidx.ui.geometry.Rect other);
method public boolean overlaps(androidx.ui.geometry.Rect other);
- method public androidx.ui.geometry.Rect shift(androidx.ui.geometry.Offset offset);
+ method public androidx.ui.geometry.Rect shift-RIqb49o(long offset);
method public androidx.ui.geometry.Rect translate(float translateX, float translateY);
property public final float height;
+ property public final float maxDimension;
+ property public final float minDimension;
property public final float width;
field public static final androidx.ui.geometry.Rect.Companion! Companion;
}
public static final class Rect.Companion {
- method public androidx.ui.geometry.Rect fromCircle(androidx.ui.geometry.Offset center, float radius);
+ method public androidx.ui.geometry.Rect fromCircle-hSKLB2U(long center, float radius);
method public androidx.ui.geometry.Rect fromLTRB(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect fromLTWH(float left, float top, float width, float height);
- method public androidx.ui.geometry.Rect fromPoints(androidx.ui.geometry.Offset a, androidx.ui.geometry.Offset b);
+ method public androidx.ui.geometry.Rect fromPoints-cs1Rg_A(long a, long b);
method public androidx.ui.geometry.Rect getLargest();
method public androidx.ui.geometry.Rect getZero();
method public float get_giantScalar();
@@ -209,49 +217,54 @@
method public static androidx.ui.geometry.Rect lerp(androidx.ui.geometry.Rect start, androidx.ui.geometry.Rect stop, float fraction);
}
- public class Size implements androidx.ui.geometry.OffsetBase {
- ctor public Size(float width, float height);
- method public final androidx.ui.geometry.Offset bottomCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset center(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerRight(androidx.ui.geometry.Offset origin);
- method public final boolean contains(androidx.ui.geometry.Offset offset);
- method public final operator androidx.ui.geometry.Size div(float operand);
- method public float getDx();
- method public float getDy();
- method public final androidx.ui.geometry.Size getFlipped();
- method public final float getHeight();
- method public final float getLongestSide();
- method public final float getShortestSide();
- method public final float getWidth();
- method public final boolean isEmpty();
- method public final operator androidx.ui.geometry.Size minus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Size other);
- method public final operator androidx.ui.geometry.Size plus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Size rem(float operand);
- method public final operator androidx.ui.geometry.Size times(float operand);
- method public final androidx.ui.geometry.Offset topCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Size truncDiv(float operand);
- property public float dx;
- property public float dy;
+ public final inline class Size {
+ ctor public Size();
+ method public static long bottomCenter-RIqb49o(long $this, long origin);
+ method public static long bottomLeft-RIqb49o(long $this, long origin);
+ method public static long bottomRight-RIqb49o(long $this, long origin);
+ method public static long center-RIqb49o(long $this, long origin);
+ method public static long centerLeft-RIqb49o(long $this, long origin);
+ method public static long centerRight-RIqb49o(long $this, long origin);
+ method public static long constructor-impl(internal long value);
+ method public static boolean contains-RIqb49o(long $this, long offset);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static long getFlipped-impl(long $this);
+ method public static float getHeight-impl(long $this);
+ method public static float getMaxDimension-impl(long $this);
+ method public static float getMinDimension-impl(long $this);
+ method public static float getWidth-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static boolean isEmpty-impl(long $this);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long minus-b2zCL34(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long topCenter-RIqb49o(long $this, long origin);
+ method public static long topLeft-RIqb49o(long $this, long origin);
+ method public static long topRight-RIqb49o(long $this, long origin);
+ method public static long truncDiv-impl(long $this, float operand);
field public static final androidx.ui.geometry.Size.Companion! Companion;
}
public static final class Size.Companion {
- method public androidx.ui.geometry.Size copy(androidx.ui.geometry.Size source);
- method public androidx.ui.geometry.Size fromHeight(float height);
- method public androidx.ui.geometry.Size fromRadius(float radius);
- method public androidx.ui.geometry.Size fromWidth(float width);
- method public androidx.ui.geometry.Size getInfinite();
- method public androidx.ui.geometry.Size getZero();
- method public androidx.ui.geometry.Size? lerp(androidx.ui.geometry.Size start, androidx.ui.geometry.Size stop, float fraction);
- method public androidx.ui.geometry.Size square(float dimension);
- property public final androidx.ui.geometry.Size infinite;
- property public final androidx.ui.geometry.Size zero;
+ method public long copy-b2zCL34(long source);
+ method public long fromHeight(float height);
+ method public long fromRadius(float radius);
+ method public long fromWidth(float width);
+ method public long getInfinite();
+ method public long getZero();
+ method public androidx.ui.geometry.Size? lerp-T-c3OIQ(long start, long stop, float fraction);
+ method public long square(float dimension);
+ property public final long infinite;
+ property public final long zero;
+ }
+
+ public final class SizeKt {
+ method public static long Size(float width, float height);
}
}
diff --git a/ui/ui-geometry/api/restricted_current.txt b/ui/ui-geometry/api/restricted_current.txt
index 4ad12c3..390ba95 100644
--- a/ui/ui-geometry/api/restricted_current.txt
+++ b/ui/ui-geometry/api/restricted_current.txt
@@ -1,36 +1,38 @@
// Signature format: 3.0
package androidx.ui.geometry {
- public final class Offset implements androidx.ui.geometry.OffsetBase {
- ctor public Offset(float dx, float dy);
- method public infix androidx.ui.geometry.Rect and(androidx.ui.geometry.Size other);
- method public float component1();
- method public float component2();
- method public androidx.ui.geometry.Offset copy(float dx, float dy);
- method public operator androidx.ui.geometry.Offset div(float operand);
- method public float getDirection();
- method public float getDistance();
- method public float getDistanceSquared();
- method public float getDx();
- method public float getDy();
- method public operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset plus(androidx.ui.geometry.Offset other);
- method public operator androidx.ui.geometry.Offset rem(float operand);
- method public androidx.ui.geometry.Offset scale(float scaleX, float scaleY);
- method public operator androidx.ui.geometry.Offset times(float operand);
- method public androidx.ui.geometry.Offset translate(float translateX, float translateY);
- method public androidx.ui.geometry.Offset truncDiv(float operand);
- method public operator androidx.ui.geometry.Offset unaryMinus();
+ public final inline class Offset {
+ ctor public Offset();
+ method public static infix androidx.ui.geometry.Rect and-b2zCL34(long $this, long other);
+ method public static long constructor-impl(internal long packedValue);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static float getDirection-impl(long $this);
+ method public static float getDistance-impl(long $this);
+ method public static float getDistanceSquared-impl(long $this);
+ method public static float getDx-impl(long $this);
+ method public static float getDy-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static long scale-impl(long $this, float scaleX, float scaleY);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long translate-impl(long $this, float translateX, float translateY);
+ method public static long truncDiv-impl(long $this, float operand);
+ method public static operator long unaryMinus-impl(long $this);
field public static final androidx.ui.geometry.Offset.Companion! Companion;
}
public static final class Offset.Companion {
- method public androidx.ui.geometry.Offset getInfinite();
- method public androidx.ui.geometry.Offset getZero();
- method public boolean isValid(androidx.ui.geometry.Offset offset);
- method public androidx.ui.geometry.Offset lerp(androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset stop, float fraction);
- property public final androidx.ui.geometry.Offset infinite;
- property public final androidx.ui.geometry.Offset zero;
+ method public long getInfinite();
+ method public long getZero();
+ method public boolean isValid-RIqb49o(long offset);
+ method public long lerp-nqy8KaQ(long start, long stop, float fraction);
+ property public final long infinite;
+ property public final long zero;
}
public interface OffsetBase {
@@ -46,6 +48,10 @@
property public abstract float dy;
}
+ public final class OffsetKt {
+ method public static long Offset(float dx, float dy);
+ }
+
public final class RRect {
ctor public RRect(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method public float component1();
@@ -60,7 +66,7 @@
method public float component7();
method public float component8();
method public float component9();
- method public boolean contains(androidx.ui.geometry.Offset point);
+ method public boolean contains-RIqb49o(long point);
method public androidx.ui.geometry.RRect copy(float left, float top, float right, float bottom, float topLeftRadiusX, float topLeftRadiusY, float topRightRadiusX, float topRightRadiusY, float bottomRightRadiusX, float bottomRightRadiusY, float bottomLeftRadiusX, float bottomLeftRadiusY);
method @Deprecated public androidx.ui.geometry.RRect deflate(float delta);
method public float getBottom();
@@ -98,7 +104,7 @@
method public static androidx.ui.geometry.RRect RRect(androidx.ui.geometry.Rect rect, androidx.ui.geometry.Radius topLeft = Radius.zero, androidx.ui.geometry.Radius topRight = Radius.zero, androidx.ui.geometry.Radius bottomRight = Radius.zero, androidx.ui.geometry.Radius bottomLeft = Radius.zero);
method public static androidx.ui.geometry.Radius bottomLeftRadius(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius bottomRightRadius(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.Offset center(androidx.ui.geometry.RRect);
+ method public static long center(androidx.ui.geometry.RRect);
method public static float getLongestSide(androidx.ui.geometry.RRect);
method public static float getShortestSide(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.RRect grow(androidx.ui.geometry.RRect, float delta);
@@ -113,7 +119,7 @@
method public static androidx.ui.geometry.Rect middleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect outerRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Rect safeInnerRect(androidx.ui.geometry.RRect);
- method public static androidx.ui.geometry.RRect shift(androidx.ui.geometry.RRect, androidx.ui.geometry.Offset offset);
+ method public static androidx.ui.geometry.RRect shift-q6ZkaaM(androidx.ui.geometry.RRect, long offset);
method public static androidx.ui.geometry.RRect shrink(androidx.ui.geometry.RRect, float delta);
method public static androidx.ui.geometry.Rect tallMiddleRect(androidx.ui.geometry.RRect);
method public static androidx.ui.geometry.Radius topLeftRadius(androidx.ui.geometry.RRect);
@@ -156,27 +162,27 @@
method public float component2();
method public float component3();
method public float component4();
- method public boolean contains(androidx.ui.geometry.Offset offset);
+ method public boolean contains-RIqb49o(long offset);
method public androidx.ui.geometry.Rect copy(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect deflate(float delta);
method public androidx.ui.geometry.Rect expandToInclude(androidx.ui.geometry.Rect other);
method public float getBottom();
- method public androidx.ui.geometry.Offset getBottomCenter();
- method public androidx.ui.geometry.Offset getBottomLeft();
- method public androidx.ui.geometry.Offset getBottomRight();
- method public androidx.ui.geometry.Offset getCenter();
- method public androidx.ui.geometry.Offset getCenterLeft();
- method public androidx.ui.geometry.Offset getCenterRight();
+ method public long getBottomCenter();
+ method public long getBottomLeft();
+ method public long getBottomRight();
+ method public long getCenter();
+ method public long getCenterLeft();
+ method public long getCenterRight();
method public float getHeight();
method public float getLeft();
- method public float getLongestSide();
+ method public float getMaxDimension();
+ method public float getMinDimension();
method public float getRight();
- method public float getShortestSide();
- method public androidx.ui.geometry.Size getSize();
+ method public long getSize();
method public float getTop();
- method public androidx.ui.geometry.Offset getTopCenter();
- method public androidx.ui.geometry.Offset getTopLeft();
- method public androidx.ui.geometry.Offset getTopRight();
+ method public long getTopCenter();
+ method public long getTopLeft();
+ method public long getTopRight();
method public float getWidth();
method public androidx.ui.geometry.Rect inflate(float delta);
method public androidx.ui.geometry.Rect intersect(androidx.ui.geometry.Rect other);
@@ -185,18 +191,20 @@
method public boolean isInfinite();
method public androidx.ui.geometry.Rect join(androidx.ui.geometry.Rect other);
method public boolean overlaps(androidx.ui.geometry.Rect other);
- method public androidx.ui.geometry.Rect shift(androidx.ui.geometry.Offset offset);
+ method public androidx.ui.geometry.Rect shift-RIqb49o(long offset);
method public androidx.ui.geometry.Rect translate(float translateX, float translateY);
property public final float height;
+ property public final float maxDimension;
+ property public final float minDimension;
property public final float width;
field public static final androidx.ui.geometry.Rect.Companion! Companion;
}
public static final class Rect.Companion {
- method public androidx.ui.geometry.Rect fromCircle(androidx.ui.geometry.Offset center, float radius);
+ method public androidx.ui.geometry.Rect fromCircle-hSKLB2U(long center, float radius);
method public androidx.ui.geometry.Rect fromLTRB(float left, float top, float right, float bottom);
method public androidx.ui.geometry.Rect fromLTWH(float left, float top, float width, float height);
- method public androidx.ui.geometry.Rect fromPoints(androidx.ui.geometry.Offset a, androidx.ui.geometry.Offset b);
+ method public androidx.ui.geometry.Rect fromPoints-cs1Rg_A(long a, long b);
method public androidx.ui.geometry.Rect getLargest();
method public androidx.ui.geometry.Rect getZero();
method public float get_giantScalar();
@@ -209,49 +217,54 @@
method public static androidx.ui.geometry.Rect lerp(androidx.ui.geometry.Rect start, androidx.ui.geometry.Rect stop, float fraction);
}
- public class Size implements androidx.ui.geometry.OffsetBase {
- ctor public Size(float width, float height);
- method public final androidx.ui.geometry.Offset bottomCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset bottomRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset center(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset centerRight(androidx.ui.geometry.Offset origin);
- method public final boolean contains(androidx.ui.geometry.Offset offset);
- method public final operator androidx.ui.geometry.Size div(float operand);
- method public float getDx();
- method public float getDy();
- method public final androidx.ui.geometry.Size getFlipped();
- method public final float getHeight();
- method public final float getLongestSide();
- method public final float getShortestSide();
- method public final float getWidth();
- method public final boolean isEmpty();
- method public final operator androidx.ui.geometry.Size minus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Offset minus(androidx.ui.geometry.Size other);
- method public final operator androidx.ui.geometry.Size plus(androidx.ui.geometry.Offset other);
- method public final operator androidx.ui.geometry.Size rem(float operand);
- method public final operator androidx.ui.geometry.Size times(float operand);
- method public final androidx.ui.geometry.Offset topCenter(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topLeft(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Offset topRight(androidx.ui.geometry.Offset origin);
- method public final androidx.ui.geometry.Size truncDiv(float operand);
- property public float dx;
- property public float dy;
+ public final inline class Size {
+ ctor public Size();
+ method public static long bottomCenter-RIqb49o(long $this, long origin);
+ method public static long bottomLeft-RIqb49o(long $this, long origin);
+ method public static long bottomRight-RIqb49o(long $this, long origin);
+ method public static long center-RIqb49o(long $this, long origin);
+ method public static long centerLeft-RIqb49o(long $this, long origin);
+ method public static long centerRight-RIqb49o(long $this, long origin);
+ method public static long constructor-impl(internal long value);
+ method public static boolean contains-RIqb49o(long $this, long offset);
+ method public static operator long div-impl(long $this, float operand);
+ method public static inline boolean equals-impl(long p, Object? p1);
+ method public static boolean equals-impl0(long p1, long p2);
+ method public static long getFlipped-impl(long $this);
+ method public static float getHeight-impl(long $this);
+ method public static float getMaxDimension-impl(long $this);
+ method public static float getMinDimension-impl(long $this);
+ method public static float getWidth-impl(long $this);
+ method public static inline int hashCode-impl(long p);
+ method public static boolean isEmpty-impl(long $this);
+ method public static operator long minus-RIqb49o(long $this, long other);
+ method public static operator long minus-b2zCL34(long $this, long other);
+ method public static operator long plus-RIqb49o(long $this, long other);
+ method public static operator long rem-impl(long $this, float operand);
+ method public static operator long times-impl(long $this, float operand);
+ method public static String toString-impl(long $this);
+ method public static long topCenter-RIqb49o(long $this, long origin);
+ method public static long topLeft-RIqb49o(long $this, long origin);
+ method public static long topRight-RIqb49o(long $this, long origin);
+ method public static long truncDiv-impl(long $this, float operand);
field public static final androidx.ui.geometry.Size.Companion! Companion;
}
public static final class Size.Companion {
- method public androidx.ui.geometry.Size copy(androidx.ui.geometry.Size source);
- method public androidx.ui.geometry.Size fromHeight(float height);
- method public androidx.ui.geometry.Size fromRadius(float radius);
- method public androidx.ui.geometry.Size fromWidth(float width);
- method public androidx.ui.geometry.Size getInfinite();
- method public androidx.ui.geometry.Size getZero();
- method public androidx.ui.geometry.Size? lerp(androidx.ui.geometry.Size start, androidx.ui.geometry.Size stop, float fraction);
- method public androidx.ui.geometry.Size square(float dimension);
- property public final androidx.ui.geometry.Size infinite;
- property public final androidx.ui.geometry.Size zero;
+ method public long copy-b2zCL34(long source);
+ method public long fromHeight(float height);
+ method public long fromRadius(float radius);
+ method public long fromWidth(float width);
+ method public long getInfinite();
+ method public long getZero();
+ method public androidx.ui.geometry.Size? lerp-T-c3OIQ(long start, long stop, float fraction);
+ method public long square(float dimension);
+ property public final long infinite;
+ property public final long zero;
+ }
+
+ public final class SizeKt {
+ method public static long Size(float width, float height);
}
}
diff --git a/ui/ui-geometry/src/main/java/androidx/ui/geometry/Offset.kt b/ui/ui-geometry/src/main/java/androidx/ui/geometry/Offset.kt
index 21eb9d6..2780b7e 100644
--- a/ui/ui-geometry/src/main/java/androidx/ui/geometry/Offset.kt
+++ b/ui/ui-geometry/src/main/java/androidx/ui/geometry/Offset.kt
@@ -16,13 +16,22 @@
package androidx.ui.geometry
+import androidx.compose.Immutable
import androidx.ui.util.lerp
+import androidx.ui.util.packFloats
import androidx.ui.util.toStringAsFixed
+import androidx.ui.util.unpackFloat1
+import androidx.ui.util.unpackFloat2
import kotlin.math.atan2
import kotlin.math.sqrt
import kotlin.math.truncate
/**
+ * Constructs an Offset from the given relative x and y offsets
+ */
+fun Offset(dx: Float, dy: Float) = Offset(packFloats(dx, dy))
+
+/**
* An immutable 2D floating-point offset.
*
* Generally speaking, Offsets can be interpreted in two ways:
@@ -48,7 +57,14 @@
* Creates an offset. The first argument sets [dx], the horizontal component,
* and the second sets [dy], the vertical component.
*/
-data class Offset(override val dx: Float, override val dy: Float) : OffsetBase {
+@Immutable
+inline class Offset(@PublishedApi internal val packedValue: Long) {
+
+ val dx: Float
+ get() = unpackFloat1(packedValue)
+
+ val dy: Float
+ get() = unpackFloat2(packedValue)
companion object {
/**
@@ -274,24 +290,4 @@
infix fun and(other: Size): Rect = Rect.fromLTWH(dx, dy, other.width, other.height)
override fun toString() = "Offset(${dx.toStringAsFixed(1)}, ${dy.toStringAsFixed(1)})"
-
- // We need to manually override equals (and thus also hashCode) because the auto generated
- // equals was treating Offset(0.0, 0.0) != Offset(0.0, -0.0).
- // Filed as https://youtrack.jetbrains.com/issue/KT-27343
-
- override fun equals(other: Any?): Boolean {
- if (this === other) return true
- if (other !is Offset) return false
-
- if (dx != other.dx) return false
- if (dy != other.dy) return false
-
- return true
- }
-
- override fun hashCode(): Int {
- var result = dx.hashCode()
- result = 31 * result + dy.hashCode()
- return result
- }
}
\ No newline at end of file
diff --git a/ui/ui-geometry/src/main/java/androidx/ui/geometry/Rect.kt b/ui/ui-geometry/src/main/java/androidx/ui/geometry/Rect.kt
index 71b77e2..d24d2e5 100644
--- a/ui/ui-geometry/src/main/java/androidx/ui/geometry/Rect.kt
+++ b/ui/ui-geometry/src/main/java/androidx/ui/geometry/Rect.kt
@@ -19,6 +19,8 @@
import androidx.ui.util.lerp
import androidx.ui.util.toStringAsFixed
import kotlin.math.absoluteValue
+import kotlin.math.max
+import kotlin.math.min
// TODO(mount): Normalize this class. There are many methods that can be extension functions.
/**
@@ -237,13 +239,15 @@
* The lesser of the magnitudes of the [width] and the [height] of this
* rectangle.
*/
- fun getShortestSide(): Float = Math.min(width.absoluteValue, height.absoluteValue)
+ val minDimension: Float
+ get() = min(width.absoluteValue, height.absoluteValue)
/**
* The greater of the magnitudes of the [width] and the [height] of this
* rectangle.
*/
- fun getLongestSide(): Float = Math.max(width.absoluteValue, height.absoluteValue)
+ val maxDimension: Float
+ get() = max(width.absoluteValue, height.absoluteValue)
/**
* The offset to the intersection of the top and left edges of this rectangle.
diff --git a/ui/ui-geometry/src/main/java/androidx/ui/geometry/Size.kt b/ui/ui-geometry/src/main/java/androidx/ui/geometry/Size.kt
index 65d5a13..2825aad 100644
--- a/ui/ui-geometry/src/main/java/androidx/ui/geometry/Size.kt
+++ b/ui/ui-geometry/src/main/java/androidx/ui/geometry/Size.kt
@@ -16,20 +16,35 @@
package androidx.ui.geometry
+import androidx.compose.Immutable
import androidx.ui.util.lerp
+import androidx.ui.util.packFloats
import androidx.ui.util.toStringAsFixed
+import androidx.ui.util.unpackFloat1
+import androidx.ui.util.unpackFloat2
import kotlin.math.absoluteValue
+import kotlin.math.max
+import kotlin.math.min
import kotlin.math.truncate
/**
+ * Constructs a [Size] from the given width and height
+ */
+fun Size(width: Float, height: Float) = Size(packFloats(width, height))
+
+/**
* Holds a 2D floating-point size.
*
* You can think of this as an [Offset] from the origin.
*/
-open class Size(val width: Float, val height: Float) : OffsetBase {
+@Immutable
+inline class Size(@PublishedApi internal val value: Long) {
- override val dx: Float = width
- override val dy: Float = height
+ val width: Float
+ get() = unpackFloat1(value)
+
+ val height: Float
+ get() = unpackFloat2(value)
companion object {
/**
@@ -202,12 +217,14 @@
/**
* The lesser of the magnitudes of the [width] and the [height].
*/
- fun getShortestSide(): Float = Math.min(width.absoluteValue, height.absoluteValue)
+ val minDimension: Float
+ get() = min(width.absoluteValue, height.absoluteValue)
/**
* The greater of the magnitudes of the [width] and the [height].
*/
- fun getLongestSide(): Float = Math.max(width.absoluteValue, height.absoluteValue)
+ val maxDimension: Float
+ get() = max(width.absoluteValue, height.absoluteValue)
// Convenience methods that do the equivalent of calling the similarly named
// methods on a Rect constructed from the given origin and this size.
@@ -308,18 +325,4 @@
fun getFlipped() = Size(height, width)
override fun toString() = "Size(${width.toStringAsFixed(1)}, ${height.toStringAsFixed(1)})"
-
- // TODO(Andrey): Can't use data class because of _DebugSize class extending this one.
- override fun equals(other: Any?): Boolean {
- if (this === other) return true
- if (other !is Size) return false
-
- return dx == other.dx && dy == other.dy
- }
-
- override fun hashCode(): Int {
- var result = dx.hashCode()
- result = 31 * result + dy.hashCode()
- return result
- }
-}
+}
\ No newline at end of file
diff --git a/ui/ui-graphics/api/0.1.0-dev11.txt b/ui/ui-graphics/api/0.1.0-dev11.txt
index ff23d53..8b672ec 100644
--- a/ui/ui-graphics/api/0.1.0-dev11.txt
+++ b/ui/ui-graphics/api/0.1.0-dev11.txt
@@ -29,7 +29,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -50,7 +50,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType value);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public androidx.ui.graphics.PathFillType fillType;
property public boolean isConvex;
property public boolean isEmpty;
@@ -95,8 +95,8 @@
enum_constant public static final androidx.ui.graphics.BlendMode xor;
}
- public interface Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public abstract sealed class Brush {
+ method public abstract void applyTo(androidx.ui.graphics.Paint p);
}
public final class BrushKt {
@@ -112,22 +112,25 @@
public interface Canvas {
method public void clipPath(androidx.ui.graphics.Path path);
- method public void clipRRect(androidx.ui.geometry.RRect rrect);
- method public void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public default void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public void clipRect(float left, float top, float right, float bottom, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
method public void concat(androidx.ui.graphics.vectormath.Matrix4 matrix4);
method public void disableZ();
- method public void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public default void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
method public default void drawArcRad(androidx.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.ui.graphics.Paint paint);
- method public void drawCircle(androidx.ui.geometry.Offset center, float radius, androidx.ui.graphics.Paint paint);
- method public void drawImage(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Offset topLeftOffset, androidx.ui.graphics.Paint paint);
- method public void drawImageRect(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? src, androidx.ui.geometry.Rect dst, androidx.ui.graphics.Paint paint);
- method public void drawLine(androidx.ui.geometry.Offset p1, androidx.ui.geometry.Offset p2, androidx.ui.graphics.Paint paint);
- method public void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawCircle-NfwrgZA(long center, float radius, androidx.ui.graphics.Paint paint);
+ method public void drawImage--AHD2Ng(androidx.ui.graphics.ImageAsset image, long topLeftOffset, androidx.ui.graphics.Paint paint);
+ method public void drawImageRect-btuv3no(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset, long dstSize, androidx.ui.graphics.Paint paint);
+ method public void drawLine-d9kBv1M(long p1, long p2, androidx.ui.graphics.Paint paint);
+ method public default void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawOval(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Paint paint);
method public void drawPicture(androidx.ui.graphics.Picture picture);
method public void drawPoints(androidx.ui.graphics.PointMode pointMode, java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.Paint paint);
method public void drawRawPoints(androidx.ui.graphics.PointMode pointMode, float[] points, androidx.ui.graphics.Paint paint);
- method public void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public default void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawRect(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.ui.graphics.Paint paint);
method public void drawVertices(androidx.ui.graphics.Vertices vertices, androidx.ui.graphics.BlendMode blendMode, androidx.ui.graphics.Paint paint);
method public void enableZ();
@@ -297,7 +300,9 @@
public final class OutlineKt {
method public static void addOutline(androidx.ui.graphics.Path, androidx.ui.graphics.Outline outline);
+ method public static void drawOutline(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
method public static void drawOutline(androidx.ui.graphics.Canvas, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Paint paint);
+ method public static void drawOutline-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
}
public final class Paint {
@@ -354,7 +359,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset = Offset.zero);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset = Offset.zero);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -375,7 +380,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType p);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public abstract androidx.ui.graphics.PathFillType fillType;
property public abstract boolean isConvex;
property public abstract boolean isEmpty;
@@ -447,25 +452,25 @@
method public static inline String! toString-impl(android.graphics.Shader! p);
}
- public class ShaderBrush implements androidx.ui.graphics.Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public class ShaderBrush extends androidx.ui.graphics.Brush {
+ method public final void applyTo(androidx.ui.graphics.Paint p);
method public final android.graphics.Shader getShader();
}
public final class ShaderKt {
method public static android.graphics.Shader ImageShader(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.TileMode tileModeX = androidx.ui.graphics.TileMode.Clamp, androidx.ui.graphics.TileMode tileModeY = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader LinearGradientShader(androidx.ui.geometry.Offset from, androidx.ui.geometry.Offset to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader RadialGradientShader(androidx.ui.geometry.Offset center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader LinearGradientShader-BG1VTC8(long from, long to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader RadialGradientShader-nSjqbmE(long center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
}
public final class Shadow {
method public long component1();
- method public androidx.ui.geometry.Offset component2();
+ method public long component2();
method public float component3();
- method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, androidx.ui.geometry.Offset offset, float blurRadius);
+ method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, long offset, float blurRadius);
method public float getBlurRadius();
method public long getColor();
- method public androidx.ui.geometry.Offset getOffset();
+ method public long getOffset();
field public static final androidx.ui.graphics.Shadow.Companion! Companion;
}
@@ -482,10 +487,8 @@
method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
}
- public final class SolidColor implements androidx.ui.graphics.Brush {
+ public final class SolidColor extends androidx.ui.graphics.Brush {
method public void applyTo(androidx.ui.graphics.Paint p);
- method public long component1();
- method public androidx.ui.graphics.SolidColor copy-QEYXlZo(long value);
method public long getValue();
}
@@ -715,39 +718,102 @@
package androidx.ui.graphics.painter {
+ public final class CanvasScope {
+ ctor public CanvasScope();
+ method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public long getCenter();
+ method public long getSize();
+ property public final long center;
+ property public final long size;
+ field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
+ field public static final float DefaultAlpha = 1.0f;
+ }
+
+ public static final class CanvasScope.Companion {
+ method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
+ property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
+ }
+
+ public final class CanvasScopeKt {
+ method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? clipRect-2CUYwUY(androidx.ui.graphics.painter.CanvasScope, long topLeft = Offset.zero, long size = this.size, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float dx, float dy = dx, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float dx, float dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ }
+
public final class ColorPainter extends androidx.ui.graphics.painter.Painter {
method public long component1();
method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
method public long getColor();
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
+ public abstract sealed class DrawStyle {
+ }
+
+ public final class Fill extends androidx.ui.graphics.painter.DrawStyle {
+ field public static final androidx.ui.graphics.painter.Fill! INSTANCE;
+ }
+
public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
- ctor public ImagePainter(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
- method public androidx.ui.geometry.Rect? component2();
- method public androidx.ui.graphics.painter.ImagePainter copy(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
+ method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method public androidx.ui.geometry.Rect? getSrcBounds();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
- public final class ImagePainterKt {
- }
-
public abstract class Painter {
ctor public Painter();
method protected boolean applyAlpha(float alpha);
method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
method protected boolean applyRtl(boolean rtl);
- method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+ method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
- method protected abstract void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public abstract androidx.ui.unit.PxSize intrinsicSize;
}
+ public final class Stroke extends androidx.ui.graphics.painter.DrawStyle {
+ ctor public Stroke(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ ctor public Stroke();
+ method public float component1();
+ method public float component2();
+ method public androidx.ui.graphics.StrokeCap component3();
+ method public androidx.ui.graphics.StrokeJoin component4();
+ method public android.graphics.PathEffect? component5();
+ method public androidx.ui.graphics.painter.Stroke copy(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ method public androidx.ui.graphics.StrokeCap getCap();
+ method public androidx.ui.graphics.StrokeJoin getJoin();
+ method public float getMiter();
+ method public android.graphics.PathEffect? getPathEffect();
+ method public float getWidth();
+ }
+
}
package androidx.ui.graphics.vector {
@@ -1144,7 +1210,7 @@
method public static androidx.ui.geometry.Rect inverseTransformRect(androidx.ui.graphics.vectormath.Matrix4 transform, androidx.ui.geometry.Rect rect);
method public static boolean isIdentity(androidx.ui.graphics.vectormath.Matrix4);
method public static boolean matrixEquals(androidx.ui.graphics.vectormath.Matrix4? a, androidx.ui.graphics.vectormath.Matrix4? b);
- method public static androidx.ui.geometry.Offset transformPoint(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Offset point);
+ method public static long transformPoint-k2M_ft0(androidx.ui.graphics.vectormath.Matrix4, long point);
method public static androidx.ui.geometry.Rect transformRect(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Rect rect);
}
diff --git a/ui/ui-graphics/api/current.txt b/ui/ui-graphics/api/current.txt
index ff23d53..8b672ec 100644
--- a/ui/ui-graphics/api/current.txt
+++ b/ui/ui-graphics/api/current.txt
@@ -29,7 +29,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -50,7 +50,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType value);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public androidx.ui.graphics.PathFillType fillType;
property public boolean isConvex;
property public boolean isEmpty;
@@ -95,8 +95,8 @@
enum_constant public static final androidx.ui.graphics.BlendMode xor;
}
- public interface Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public abstract sealed class Brush {
+ method public abstract void applyTo(androidx.ui.graphics.Paint p);
}
public final class BrushKt {
@@ -112,22 +112,25 @@
public interface Canvas {
method public void clipPath(androidx.ui.graphics.Path path);
- method public void clipRRect(androidx.ui.geometry.RRect rrect);
- method public void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public default void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public void clipRect(float left, float top, float right, float bottom, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
method public void concat(androidx.ui.graphics.vectormath.Matrix4 matrix4);
method public void disableZ();
- method public void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public default void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
method public default void drawArcRad(androidx.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.ui.graphics.Paint paint);
- method public void drawCircle(androidx.ui.geometry.Offset center, float radius, androidx.ui.graphics.Paint paint);
- method public void drawImage(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Offset topLeftOffset, androidx.ui.graphics.Paint paint);
- method public void drawImageRect(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? src, androidx.ui.geometry.Rect dst, androidx.ui.graphics.Paint paint);
- method public void drawLine(androidx.ui.geometry.Offset p1, androidx.ui.geometry.Offset p2, androidx.ui.graphics.Paint paint);
- method public void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawCircle-NfwrgZA(long center, float radius, androidx.ui.graphics.Paint paint);
+ method public void drawImage--AHD2Ng(androidx.ui.graphics.ImageAsset image, long topLeftOffset, androidx.ui.graphics.Paint paint);
+ method public void drawImageRect-btuv3no(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset, long dstSize, androidx.ui.graphics.Paint paint);
+ method public void drawLine-d9kBv1M(long p1, long p2, androidx.ui.graphics.Paint paint);
+ method public default void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawOval(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Paint paint);
method public void drawPicture(androidx.ui.graphics.Picture picture);
method public void drawPoints(androidx.ui.graphics.PointMode pointMode, java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.Paint paint);
method public void drawRawPoints(androidx.ui.graphics.PointMode pointMode, float[] points, androidx.ui.graphics.Paint paint);
- method public void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public default void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawRect(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.ui.graphics.Paint paint);
method public void drawVertices(androidx.ui.graphics.Vertices vertices, androidx.ui.graphics.BlendMode blendMode, androidx.ui.graphics.Paint paint);
method public void enableZ();
@@ -297,7 +300,9 @@
public final class OutlineKt {
method public static void addOutline(androidx.ui.graphics.Path, androidx.ui.graphics.Outline outline);
+ method public static void drawOutline(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
method public static void drawOutline(androidx.ui.graphics.Canvas, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Paint paint);
+ method public static void drawOutline-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
}
public final class Paint {
@@ -354,7 +359,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset = Offset.zero);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset = Offset.zero);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -375,7 +380,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType p);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public abstract androidx.ui.graphics.PathFillType fillType;
property public abstract boolean isConvex;
property public abstract boolean isEmpty;
@@ -447,25 +452,25 @@
method public static inline String! toString-impl(android.graphics.Shader! p);
}
- public class ShaderBrush implements androidx.ui.graphics.Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public class ShaderBrush extends androidx.ui.graphics.Brush {
+ method public final void applyTo(androidx.ui.graphics.Paint p);
method public final android.graphics.Shader getShader();
}
public final class ShaderKt {
method public static android.graphics.Shader ImageShader(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.TileMode tileModeX = androidx.ui.graphics.TileMode.Clamp, androidx.ui.graphics.TileMode tileModeY = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader LinearGradientShader(androidx.ui.geometry.Offset from, androidx.ui.geometry.Offset to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader RadialGradientShader(androidx.ui.geometry.Offset center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader LinearGradientShader-BG1VTC8(long from, long to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader RadialGradientShader-nSjqbmE(long center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
}
public final class Shadow {
method public long component1();
- method public androidx.ui.geometry.Offset component2();
+ method public long component2();
method public float component3();
- method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, androidx.ui.geometry.Offset offset, float blurRadius);
+ method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, long offset, float blurRadius);
method public float getBlurRadius();
method public long getColor();
- method public androidx.ui.geometry.Offset getOffset();
+ method public long getOffset();
field public static final androidx.ui.graphics.Shadow.Companion! Companion;
}
@@ -482,10 +487,8 @@
method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
}
- public final class SolidColor implements androidx.ui.graphics.Brush {
+ public final class SolidColor extends androidx.ui.graphics.Brush {
method public void applyTo(androidx.ui.graphics.Paint p);
- method public long component1();
- method public androidx.ui.graphics.SolidColor copy-QEYXlZo(long value);
method public long getValue();
}
@@ -715,39 +718,102 @@
package androidx.ui.graphics.painter {
+ public final class CanvasScope {
+ ctor public CanvasScope();
+ method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public long getCenter();
+ method public long getSize();
+ property public final long center;
+ property public final long size;
+ field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
+ field public static final float DefaultAlpha = 1.0f;
+ }
+
+ public static final class CanvasScope.Companion {
+ method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
+ property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
+ }
+
+ public final class CanvasScopeKt {
+ method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? clipRect-2CUYwUY(androidx.ui.graphics.painter.CanvasScope, long topLeft = Offset.zero, long size = this.size, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float dx, float dy = dx, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float dx, float dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ }
+
public final class ColorPainter extends androidx.ui.graphics.painter.Painter {
method public long component1();
method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
method public long getColor();
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
+ public abstract sealed class DrawStyle {
+ }
+
+ public final class Fill extends androidx.ui.graphics.painter.DrawStyle {
+ field public static final androidx.ui.graphics.painter.Fill! INSTANCE;
+ }
+
public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
- ctor public ImagePainter(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
- method public androidx.ui.geometry.Rect? component2();
- method public androidx.ui.graphics.painter.ImagePainter copy(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
+ method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method public androidx.ui.geometry.Rect? getSrcBounds();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
- public final class ImagePainterKt {
- }
-
public abstract class Painter {
ctor public Painter();
method protected boolean applyAlpha(float alpha);
method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
method protected boolean applyRtl(boolean rtl);
- method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+ method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
- method protected abstract void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public abstract androidx.ui.unit.PxSize intrinsicSize;
}
+ public final class Stroke extends androidx.ui.graphics.painter.DrawStyle {
+ ctor public Stroke(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ ctor public Stroke();
+ method public float component1();
+ method public float component2();
+ method public androidx.ui.graphics.StrokeCap component3();
+ method public androidx.ui.graphics.StrokeJoin component4();
+ method public android.graphics.PathEffect? component5();
+ method public androidx.ui.graphics.painter.Stroke copy(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ method public androidx.ui.graphics.StrokeCap getCap();
+ method public androidx.ui.graphics.StrokeJoin getJoin();
+ method public float getMiter();
+ method public android.graphics.PathEffect? getPathEffect();
+ method public float getWidth();
+ }
+
}
package androidx.ui.graphics.vector {
@@ -1144,7 +1210,7 @@
method public static androidx.ui.geometry.Rect inverseTransformRect(androidx.ui.graphics.vectormath.Matrix4 transform, androidx.ui.geometry.Rect rect);
method public static boolean isIdentity(androidx.ui.graphics.vectormath.Matrix4);
method public static boolean matrixEquals(androidx.ui.graphics.vectormath.Matrix4? a, androidx.ui.graphics.vectormath.Matrix4? b);
- method public static androidx.ui.geometry.Offset transformPoint(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Offset point);
+ method public static long transformPoint-k2M_ft0(androidx.ui.graphics.vectormath.Matrix4, long point);
method public static androidx.ui.geometry.Rect transformRect(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Rect rect);
}
diff --git a/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev11.txt b/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev11.txt
index ff23d53..8b672ec 100644
--- a/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev11.txt
+++ b/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev11.txt
@@ -29,7 +29,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -50,7 +50,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType value);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public androidx.ui.graphics.PathFillType fillType;
property public boolean isConvex;
property public boolean isEmpty;
@@ -95,8 +95,8 @@
enum_constant public static final androidx.ui.graphics.BlendMode xor;
}
- public interface Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public abstract sealed class Brush {
+ method public abstract void applyTo(androidx.ui.graphics.Paint p);
}
public final class BrushKt {
@@ -112,22 +112,25 @@
public interface Canvas {
method public void clipPath(androidx.ui.graphics.Path path);
- method public void clipRRect(androidx.ui.geometry.RRect rrect);
- method public void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public default void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public void clipRect(float left, float top, float right, float bottom, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
method public void concat(androidx.ui.graphics.vectormath.Matrix4 matrix4);
method public void disableZ();
- method public void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public default void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
method public default void drawArcRad(androidx.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.ui.graphics.Paint paint);
- method public void drawCircle(androidx.ui.geometry.Offset center, float radius, androidx.ui.graphics.Paint paint);
- method public void drawImage(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Offset topLeftOffset, androidx.ui.graphics.Paint paint);
- method public void drawImageRect(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? src, androidx.ui.geometry.Rect dst, androidx.ui.graphics.Paint paint);
- method public void drawLine(androidx.ui.geometry.Offset p1, androidx.ui.geometry.Offset p2, androidx.ui.graphics.Paint paint);
- method public void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawCircle-NfwrgZA(long center, float radius, androidx.ui.graphics.Paint paint);
+ method public void drawImage--AHD2Ng(androidx.ui.graphics.ImageAsset image, long topLeftOffset, androidx.ui.graphics.Paint paint);
+ method public void drawImageRect-btuv3no(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset, long dstSize, androidx.ui.graphics.Paint paint);
+ method public void drawLine-d9kBv1M(long p1, long p2, androidx.ui.graphics.Paint paint);
+ method public default void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawOval(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Paint paint);
method public void drawPicture(androidx.ui.graphics.Picture picture);
method public void drawPoints(androidx.ui.graphics.PointMode pointMode, java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.Paint paint);
method public void drawRawPoints(androidx.ui.graphics.PointMode pointMode, float[] points, androidx.ui.graphics.Paint paint);
- method public void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public default void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawRect(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.ui.graphics.Paint paint);
method public void drawVertices(androidx.ui.graphics.Vertices vertices, androidx.ui.graphics.BlendMode blendMode, androidx.ui.graphics.Paint paint);
method public void enableZ();
@@ -297,7 +300,9 @@
public final class OutlineKt {
method public static void addOutline(androidx.ui.graphics.Path, androidx.ui.graphics.Outline outline);
+ method public static void drawOutline(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
method public static void drawOutline(androidx.ui.graphics.Canvas, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Paint paint);
+ method public static void drawOutline-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
}
public final class Paint {
@@ -354,7 +359,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset = Offset.zero);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset = Offset.zero);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -375,7 +380,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType p);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public abstract androidx.ui.graphics.PathFillType fillType;
property public abstract boolean isConvex;
property public abstract boolean isEmpty;
@@ -447,25 +452,25 @@
method public static inline String! toString-impl(android.graphics.Shader! p);
}
- public class ShaderBrush implements androidx.ui.graphics.Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public class ShaderBrush extends androidx.ui.graphics.Brush {
+ method public final void applyTo(androidx.ui.graphics.Paint p);
method public final android.graphics.Shader getShader();
}
public final class ShaderKt {
method public static android.graphics.Shader ImageShader(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.TileMode tileModeX = androidx.ui.graphics.TileMode.Clamp, androidx.ui.graphics.TileMode tileModeY = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader LinearGradientShader(androidx.ui.geometry.Offset from, androidx.ui.geometry.Offset to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader RadialGradientShader(androidx.ui.geometry.Offset center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader LinearGradientShader-BG1VTC8(long from, long to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader RadialGradientShader-nSjqbmE(long center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
}
public final class Shadow {
method public long component1();
- method public androidx.ui.geometry.Offset component2();
+ method public long component2();
method public float component3();
- method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, androidx.ui.geometry.Offset offset, float blurRadius);
+ method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, long offset, float blurRadius);
method public float getBlurRadius();
method public long getColor();
- method public androidx.ui.geometry.Offset getOffset();
+ method public long getOffset();
field public static final androidx.ui.graphics.Shadow.Companion! Companion;
}
@@ -482,10 +487,8 @@
method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
}
- public final class SolidColor implements androidx.ui.graphics.Brush {
+ public final class SolidColor extends androidx.ui.graphics.Brush {
method public void applyTo(androidx.ui.graphics.Paint p);
- method public long component1();
- method public androidx.ui.graphics.SolidColor copy-QEYXlZo(long value);
method public long getValue();
}
@@ -715,39 +718,102 @@
package androidx.ui.graphics.painter {
+ public final class CanvasScope {
+ ctor public CanvasScope();
+ method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public long getCenter();
+ method public long getSize();
+ property public final long center;
+ property public final long size;
+ field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
+ field public static final float DefaultAlpha = 1.0f;
+ }
+
+ public static final class CanvasScope.Companion {
+ method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
+ property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
+ }
+
+ public final class CanvasScopeKt {
+ method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? clipRect-2CUYwUY(androidx.ui.graphics.painter.CanvasScope, long topLeft = Offset.zero, long size = this.size, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float dx, float dy = dx, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float dx, float dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ }
+
public final class ColorPainter extends androidx.ui.graphics.painter.Painter {
method public long component1();
method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
method public long getColor();
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
+ public abstract sealed class DrawStyle {
+ }
+
+ public final class Fill extends androidx.ui.graphics.painter.DrawStyle {
+ field public static final androidx.ui.graphics.painter.Fill! INSTANCE;
+ }
+
public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
- ctor public ImagePainter(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
- method public androidx.ui.geometry.Rect? component2();
- method public androidx.ui.graphics.painter.ImagePainter copy(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
+ method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method public androidx.ui.geometry.Rect? getSrcBounds();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
- public final class ImagePainterKt {
- }
-
public abstract class Painter {
ctor public Painter();
method protected boolean applyAlpha(float alpha);
method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
method protected boolean applyRtl(boolean rtl);
- method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+ method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
- method protected abstract void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public abstract androidx.ui.unit.PxSize intrinsicSize;
}
+ public final class Stroke extends androidx.ui.graphics.painter.DrawStyle {
+ ctor public Stroke(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ ctor public Stroke();
+ method public float component1();
+ method public float component2();
+ method public androidx.ui.graphics.StrokeCap component3();
+ method public androidx.ui.graphics.StrokeJoin component4();
+ method public android.graphics.PathEffect? component5();
+ method public androidx.ui.graphics.painter.Stroke copy(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ method public androidx.ui.graphics.StrokeCap getCap();
+ method public androidx.ui.graphics.StrokeJoin getJoin();
+ method public float getMiter();
+ method public android.graphics.PathEffect? getPathEffect();
+ method public float getWidth();
+ }
+
}
package androidx.ui.graphics.vector {
@@ -1144,7 +1210,7 @@
method public static androidx.ui.geometry.Rect inverseTransformRect(androidx.ui.graphics.vectormath.Matrix4 transform, androidx.ui.geometry.Rect rect);
method public static boolean isIdentity(androidx.ui.graphics.vectormath.Matrix4);
method public static boolean matrixEquals(androidx.ui.graphics.vectormath.Matrix4? a, androidx.ui.graphics.vectormath.Matrix4? b);
- method public static androidx.ui.geometry.Offset transformPoint(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Offset point);
+ method public static long transformPoint-k2M_ft0(androidx.ui.graphics.vectormath.Matrix4, long point);
method public static androidx.ui.geometry.Rect transformRect(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Rect rect);
}
diff --git a/ui/ui-graphics/api/public_plus_experimental_current.txt b/ui/ui-graphics/api/public_plus_experimental_current.txt
index ff23d53..8b672ec 100644
--- a/ui/ui-graphics/api/public_plus_experimental_current.txt
+++ b/ui/ui-graphics/api/public_plus_experimental_current.txt
@@ -29,7 +29,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -50,7 +50,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType value);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public androidx.ui.graphics.PathFillType fillType;
property public boolean isConvex;
property public boolean isEmpty;
@@ -95,8 +95,8 @@
enum_constant public static final androidx.ui.graphics.BlendMode xor;
}
- public interface Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public abstract sealed class Brush {
+ method public abstract void applyTo(androidx.ui.graphics.Paint p);
}
public final class BrushKt {
@@ -112,22 +112,25 @@
public interface Canvas {
method public void clipPath(androidx.ui.graphics.Path path);
- method public void clipRRect(androidx.ui.geometry.RRect rrect);
- method public void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public default void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public void clipRect(float left, float top, float right, float bottom, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
method public void concat(androidx.ui.graphics.vectormath.Matrix4 matrix4);
method public void disableZ();
- method public void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public default void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
method public default void drawArcRad(androidx.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.ui.graphics.Paint paint);
- method public void drawCircle(androidx.ui.geometry.Offset center, float radius, androidx.ui.graphics.Paint paint);
- method public void drawImage(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Offset topLeftOffset, androidx.ui.graphics.Paint paint);
- method public void drawImageRect(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? src, androidx.ui.geometry.Rect dst, androidx.ui.graphics.Paint paint);
- method public void drawLine(androidx.ui.geometry.Offset p1, androidx.ui.geometry.Offset p2, androidx.ui.graphics.Paint paint);
- method public void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawCircle-NfwrgZA(long center, float radius, androidx.ui.graphics.Paint paint);
+ method public void drawImage--AHD2Ng(androidx.ui.graphics.ImageAsset image, long topLeftOffset, androidx.ui.graphics.Paint paint);
+ method public void drawImageRect-btuv3no(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset, long dstSize, androidx.ui.graphics.Paint paint);
+ method public void drawLine-d9kBv1M(long p1, long p2, androidx.ui.graphics.Paint paint);
+ method public default void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawOval(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Paint paint);
method public void drawPicture(androidx.ui.graphics.Picture picture);
method public void drawPoints(androidx.ui.graphics.PointMode pointMode, java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.Paint paint);
method public void drawRawPoints(androidx.ui.graphics.PointMode pointMode, float[] points, androidx.ui.graphics.Paint paint);
- method public void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public default void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawRect(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.ui.graphics.Paint paint);
method public void drawVertices(androidx.ui.graphics.Vertices vertices, androidx.ui.graphics.BlendMode blendMode, androidx.ui.graphics.Paint paint);
method public void enableZ();
@@ -297,7 +300,9 @@
public final class OutlineKt {
method public static void addOutline(androidx.ui.graphics.Path, androidx.ui.graphics.Outline outline);
+ method public static void drawOutline(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
method public static void drawOutline(androidx.ui.graphics.Canvas, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Paint paint);
+ method public static void drawOutline-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
}
public final class Paint {
@@ -354,7 +359,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset = Offset.zero);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset = Offset.zero);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -375,7 +380,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType p);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public abstract androidx.ui.graphics.PathFillType fillType;
property public abstract boolean isConvex;
property public abstract boolean isEmpty;
@@ -447,25 +452,25 @@
method public static inline String! toString-impl(android.graphics.Shader! p);
}
- public class ShaderBrush implements androidx.ui.graphics.Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public class ShaderBrush extends androidx.ui.graphics.Brush {
+ method public final void applyTo(androidx.ui.graphics.Paint p);
method public final android.graphics.Shader getShader();
}
public final class ShaderKt {
method public static android.graphics.Shader ImageShader(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.TileMode tileModeX = androidx.ui.graphics.TileMode.Clamp, androidx.ui.graphics.TileMode tileModeY = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader LinearGradientShader(androidx.ui.geometry.Offset from, androidx.ui.geometry.Offset to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader RadialGradientShader(androidx.ui.geometry.Offset center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader LinearGradientShader-BG1VTC8(long from, long to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader RadialGradientShader-nSjqbmE(long center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
}
public final class Shadow {
method public long component1();
- method public androidx.ui.geometry.Offset component2();
+ method public long component2();
method public float component3();
- method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, androidx.ui.geometry.Offset offset, float blurRadius);
+ method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, long offset, float blurRadius);
method public float getBlurRadius();
method public long getColor();
- method public androidx.ui.geometry.Offset getOffset();
+ method public long getOffset();
field public static final androidx.ui.graphics.Shadow.Companion! Companion;
}
@@ -482,10 +487,8 @@
method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
}
- public final class SolidColor implements androidx.ui.graphics.Brush {
+ public final class SolidColor extends androidx.ui.graphics.Brush {
method public void applyTo(androidx.ui.graphics.Paint p);
- method public long component1();
- method public androidx.ui.graphics.SolidColor copy-QEYXlZo(long value);
method public long getValue();
}
@@ -715,39 +718,102 @@
package androidx.ui.graphics.painter {
+ public final class CanvasScope {
+ ctor public CanvasScope();
+ method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public long getCenter();
+ method public long getSize();
+ property public final long center;
+ property public final long size;
+ field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
+ field public static final float DefaultAlpha = 1.0f;
+ }
+
+ public static final class CanvasScope.Companion {
+ method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
+ property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
+ }
+
+ public final class CanvasScopeKt {
+ method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? clipRect-2CUYwUY(androidx.ui.graphics.painter.CanvasScope, long topLeft = Offset.zero, long size = this.size, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float dx, float dy = dx, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float dx, float dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ }
+
public final class ColorPainter extends androidx.ui.graphics.painter.Painter {
method public long component1();
method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
method public long getColor();
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
+ public abstract sealed class DrawStyle {
+ }
+
+ public final class Fill extends androidx.ui.graphics.painter.DrawStyle {
+ field public static final androidx.ui.graphics.painter.Fill! INSTANCE;
+ }
+
public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
- ctor public ImagePainter(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
- method public androidx.ui.geometry.Rect? component2();
- method public androidx.ui.graphics.painter.ImagePainter copy(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
+ method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method public androidx.ui.geometry.Rect? getSrcBounds();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
- public final class ImagePainterKt {
- }
-
public abstract class Painter {
ctor public Painter();
method protected boolean applyAlpha(float alpha);
method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
method protected boolean applyRtl(boolean rtl);
- method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+ method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
- method protected abstract void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public abstract androidx.ui.unit.PxSize intrinsicSize;
}
+ public final class Stroke extends androidx.ui.graphics.painter.DrawStyle {
+ ctor public Stroke(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ ctor public Stroke();
+ method public float component1();
+ method public float component2();
+ method public androidx.ui.graphics.StrokeCap component3();
+ method public androidx.ui.graphics.StrokeJoin component4();
+ method public android.graphics.PathEffect? component5();
+ method public androidx.ui.graphics.painter.Stroke copy(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ method public androidx.ui.graphics.StrokeCap getCap();
+ method public androidx.ui.graphics.StrokeJoin getJoin();
+ method public float getMiter();
+ method public android.graphics.PathEffect? getPathEffect();
+ method public float getWidth();
+ }
+
}
package androidx.ui.graphics.vector {
@@ -1144,7 +1210,7 @@
method public static androidx.ui.geometry.Rect inverseTransformRect(androidx.ui.graphics.vectormath.Matrix4 transform, androidx.ui.geometry.Rect rect);
method public static boolean isIdentity(androidx.ui.graphics.vectormath.Matrix4);
method public static boolean matrixEquals(androidx.ui.graphics.vectormath.Matrix4? a, androidx.ui.graphics.vectormath.Matrix4? b);
- method public static androidx.ui.geometry.Offset transformPoint(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Offset point);
+ method public static long transformPoint-k2M_ft0(androidx.ui.graphics.vectormath.Matrix4, long point);
method public static androidx.ui.geometry.Rect transformRect(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Rect rect);
}
diff --git a/ui/ui-graphics/api/restricted_0.1.0-dev11.txt b/ui/ui-graphics/api/restricted_0.1.0-dev11.txt
index ff23d53..8b672ec 100644
--- a/ui/ui-graphics/api/restricted_0.1.0-dev11.txt
+++ b/ui/ui-graphics/api/restricted_0.1.0-dev11.txt
@@ -29,7 +29,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -50,7 +50,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType value);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public androidx.ui.graphics.PathFillType fillType;
property public boolean isConvex;
property public boolean isEmpty;
@@ -95,8 +95,8 @@
enum_constant public static final androidx.ui.graphics.BlendMode xor;
}
- public interface Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public abstract sealed class Brush {
+ method public abstract void applyTo(androidx.ui.graphics.Paint p);
}
public final class BrushKt {
@@ -112,22 +112,25 @@
public interface Canvas {
method public void clipPath(androidx.ui.graphics.Path path);
- method public void clipRRect(androidx.ui.geometry.RRect rrect);
- method public void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public default void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public void clipRect(float left, float top, float right, float bottom, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
method public void concat(androidx.ui.graphics.vectormath.Matrix4 matrix4);
method public void disableZ();
- method public void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public default void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
method public default void drawArcRad(androidx.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.ui.graphics.Paint paint);
- method public void drawCircle(androidx.ui.geometry.Offset center, float radius, androidx.ui.graphics.Paint paint);
- method public void drawImage(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Offset topLeftOffset, androidx.ui.graphics.Paint paint);
- method public void drawImageRect(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? src, androidx.ui.geometry.Rect dst, androidx.ui.graphics.Paint paint);
- method public void drawLine(androidx.ui.geometry.Offset p1, androidx.ui.geometry.Offset p2, androidx.ui.graphics.Paint paint);
- method public void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawCircle-NfwrgZA(long center, float radius, androidx.ui.graphics.Paint paint);
+ method public void drawImage--AHD2Ng(androidx.ui.graphics.ImageAsset image, long topLeftOffset, androidx.ui.graphics.Paint paint);
+ method public void drawImageRect-btuv3no(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset, long dstSize, androidx.ui.graphics.Paint paint);
+ method public void drawLine-d9kBv1M(long p1, long p2, androidx.ui.graphics.Paint paint);
+ method public default void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawOval(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Paint paint);
method public void drawPicture(androidx.ui.graphics.Picture picture);
method public void drawPoints(androidx.ui.graphics.PointMode pointMode, java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.Paint paint);
method public void drawRawPoints(androidx.ui.graphics.PointMode pointMode, float[] points, androidx.ui.graphics.Paint paint);
- method public void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public default void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawRect(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.ui.graphics.Paint paint);
method public void drawVertices(androidx.ui.graphics.Vertices vertices, androidx.ui.graphics.BlendMode blendMode, androidx.ui.graphics.Paint paint);
method public void enableZ();
@@ -297,7 +300,9 @@
public final class OutlineKt {
method public static void addOutline(androidx.ui.graphics.Path, androidx.ui.graphics.Outline outline);
+ method public static void drawOutline(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
method public static void drawOutline(androidx.ui.graphics.Canvas, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Paint paint);
+ method public static void drawOutline-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
}
public final class Paint {
@@ -354,7 +359,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset = Offset.zero);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset = Offset.zero);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -375,7 +380,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType p);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public abstract androidx.ui.graphics.PathFillType fillType;
property public abstract boolean isConvex;
property public abstract boolean isEmpty;
@@ -447,25 +452,25 @@
method public static inline String! toString-impl(android.graphics.Shader! p);
}
- public class ShaderBrush implements androidx.ui.graphics.Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public class ShaderBrush extends androidx.ui.graphics.Brush {
+ method public final void applyTo(androidx.ui.graphics.Paint p);
method public final android.graphics.Shader getShader();
}
public final class ShaderKt {
method public static android.graphics.Shader ImageShader(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.TileMode tileModeX = androidx.ui.graphics.TileMode.Clamp, androidx.ui.graphics.TileMode tileModeY = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader LinearGradientShader(androidx.ui.geometry.Offset from, androidx.ui.geometry.Offset to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader RadialGradientShader(androidx.ui.geometry.Offset center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader LinearGradientShader-BG1VTC8(long from, long to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader RadialGradientShader-nSjqbmE(long center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
}
public final class Shadow {
method public long component1();
- method public androidx.ui.geometry.Offset component2();
+ method public long component2();
method public float component3();
- method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, androidx.ui.geometry.Offset offset, float blurRadius);
+ method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, long offset, float blurRadius);
method public float getBlurRadius();
method public long getColor();
- method public androidx.ui.geometry.Offset getOffset();
+ method public long getOffset();
field public static final androidx.ui.graphics.Shadow.Companion! Companion;
}
@@ -482,10 +487,8 @@
method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
}
- public final class SolidColor implements androidx.ui.graphics.Brush {
+ public final class SolidColor extends androidx.ui.graphics.Brush {
method public void applyTo(androidx.ui.graphics.Paint p);
- method public long component1();
- method public androidx.ui.graphics.SolidColor copy-QEYXlZo(long value);
method public long getValue();
}
@@ -715,39 +718,102 @@
package androidx.ui.graphics.painter {
+ public final class CanvasScope {
+ ctor public CanvasScope();
+ method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public long getCenter();
+ method public long getSize();
+ property public final long center;
+ property public final long size;
+ field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
+ field public static final float DefaultAlpha = 1.0f;
+ }
+
+ public static final class CanvasScope.Companion {
+ method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
+ property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
+ }
+
+ public final class CanvasScopeKt {
+ method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? clipRect-2CUYwUY(androidx.ui.graphics.painter.CanvasScope, long topLeft = Offset.zero, long size = this.size, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float dx, float dy = dx, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float dx, float dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ }
+
public final class ColorPainter extends androidx.ui.graphics.painter.Painter {
method public long component1();
method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
method public long getColor();
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
+ public abstract sealed class DrawStyle {
+ }
+
+ public final class Fill extends androidx.ui.graphics.painter.DrawStyle {
+ field public static final androidx.ui.graphics.painter.Fill! INSTANCE;
+ }
+
public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
- ctor public ImagePainter(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
- method public androidx.ui.geometry.Rect? component2();
- method public androidx.ui.graphics.painter.ImagePainter copy(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
+ method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method public androidx.ui.geometry.Rect? getSrcBounds();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
- public final class ImagePainterKt {
- }
-
public abstract class Painter {
ctor public Painter();
method protected boolean applyAlpha(float alpha);
method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
method protected boolean applyRtl(boolean rtl);
- method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+ method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
- method protected abstract void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public abstract androidx.ui.unit.PxSize intrinsicSize;
}
+ public final class Stroke extends androidx.ui.graphics.painter.DrawStyle {
+ ctor public Stroke(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ ctor public Stroke();
+ method public float component1();
+ method public float component2();
+ method public androidx.ui.graphics.StrokeCap component3();
+ method public androidx.ui.graphics.StrokeJoin component4();
+ method public android.graphics.PathEffect? component5();
+ method public androidx.ui.graphics.painter.Stroke copy(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ method public androidx.ui.graphics.StrokeCap getCap();
+ method public androidx.ui.graphics.StrokeJoin getJoin();
+ method public float getMiter();
+ method public android.graphics.PathEffect? getPathEffect();
+ method public float getWidth();
+ }
+
}
package androidx.ui.graphics.vector {
@@ -1144,7 +1210,7 @@
method public static androidx.ui.geometry.Rect inverseTransformRect(androidx.ui.graphics.vectormath.Matrix4 transform, androidx.ui.geometry.Rect rect);
method public static boolean isIdentity(androidx.ui.graphics.vectormath.Matrix4);
method public static boolean matrixEquals(androidx.ui.graphics.vectormath.Matrix4? a, androidx.ui.graphics.vectormath.Matrix4? b);
- method public static androidx.ui.geometry.Offset transformPoint(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Offset point);
+ method public static long transformPoint-k2M_ft0(androidx.ui.graphics.vectormath.Matrix4, long point);
method public static androidx.ui.geometry.Rect transformRect(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Rect rect);
}
diff --git a/ui/ui-graphics/api/restricted_current.txt b/ui/ui-graphics/api/restricted_current.txt
index ff23d53..8b672ec 100644
--- a/ui/ui-graphics/api/restricted_current.txt
+++ b/ui/ui-graphics/api/restricted_current.txt
@@ -29,7 +29,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -50,7 +50,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType value);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public androidx.ui.graphics.PathFillType fillType;
property public boolean isConvex;
property public boolean isEmpty;
@@ -95,8 +95,8 @@
enum_constant public static final androidx.ui.graphics.BlendMode xor;
}
- public interface Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public abstract sealed class Brush {
+ method public abstract void applyTo(androidx.ui.graphics.Paint p);
}
public final class BrushKt {
@@ -112,22 +112,25 @@
public interface Canvas {
method public void clipPath(androidx.ui.graphics.Path path);
- method public void clipRRect(androidx.ui.geometry.RRect rrect);
- method public void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public default void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
+ method public void clipRect(float left, float top, float right, float bottom, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
method public void concat(androidx.ui.graphics.vectormath.Matrix4 matrix4);
method public void disableZ();
- method public void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public default void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
+ method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
method public default void drawArcRad(androidx.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.ui.graphics.Paint paint);
- method public void drawCircle(androidx.ui.geometry.Offset center, float radius, androidx.ui.graphics.Paint paint);
- method public void drawImage(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Offset topLeftOffset, androidx.ui.graphics.Paint paint);
- method public void drawImageRect(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? src, androidx.ui.geometry.Rect dst, androidx.ui.graphics.Paint paint);
- method public void drawLine(androidx.ui.geometry.Offset p1, androidx.ui.geometry.Offset p2, androidx.ui.graphics.Paint paint);
- method public void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawCircle-NfwrgZA(long center, float radius, androidx.ui.graphics.Paint paint);
+ method public void drawImage--AHD2Ng(androidx.ui.graphics.ImageAsset image, long topLeftOffset, androidx.ui.graphics.Paint paint);
+ method public void drawImageRect-btuv3no(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset, long dstSize, androidx.ui.graphics.Paint paint);
+ method public void drawLine-d9kBv1M(long p1, long p2, androidx.ui.graphics.Paint paint);
+ method public default void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawOval(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Paint paint);
method public void drawPicture(androidx.ui.graphics.Picture picture);
method public void drawPoints(androidx.ui.graphics.PointMode pointMode, java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.Paint paint);
method public void drawRawPoints(androidx.ui.graphics.PointMode pointMode, float[] points, androidx.ui.graphics.Paint paint);
- method public void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public default void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
+ method public void drawRect(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.ui.graphics.Paint paint);
method public void drawVertices(androidx.ui.graphics.Vertices vertices, androidx.ui.graphics.BlendMode blendMode, androidx.ui.graphics.Paint paint);
method public void enableZ();
@@ -297,7 +300,9 @@
public final class OutlineKt {
method public static void addOutline(androidx.ui.graphics.Path, androidx.ui.graphics.Outline outline);
+ method public static void drawOutline(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
method public static void drawOutline(androidx.ui.graphics.Canvas, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Paint paint);
+ method public static void drawOutline-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
}
public final class Paint {
@@ -354,7 +359,7 @@
method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
method public void addOval(androidx.ui.geometry.Rect oval);
- method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset = Offset.zero);
+ method public void addPath-m3TnucA(androidx.ui.graphics.Path path, long offset = Offset.zero);
method public void addRRect(androidx.ui.geometry.RRect rrect);
method public void addRect(androidx.ui.geometry.Rect rect);
method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
@@ -375,7 +380,7 @@
method public void relativeQuadraticBezierTo(float x1, float y1, float x2, float y2);
method public void reset();
method public void setFillType(androidx.ui.graphics.PathFillType p);
- method public void shift(androidx.ui.geometry.Offset offset);
+ method public void shift-RIqb49o(long offset);
property public abstract androidx.ui.graphics.PathFillType fillType;
property public abstract boolean isConvex;
property public abstract boolean isEmpty;
@@ -447,25 +452,25 @@
method public static inline String! toString-impl(android.graphics.Shader! p);
}
- public class ShaderBrush implements androidx.ui.graphics.Brush {
- method public void applyTo(androidx.ui.graphics.Paint p);
+ public class ShaderBrush extends androidx.ui.graphics.Brush {
+ method public final void applyTo(androidx.ui.graphics.Paint p);
method public final android.graphics.Shader getShader();
}
public final class ShaderKt {
method public static android.graphics.Shader ImageShader(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.TileMode tileModeX = androidx.ui.graphics.TileMode.Clamp, androidx.ui.graphics.TileMode tileModeY = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader LinearGradientShader(androidx.ui.geometry.Offset from, androidx.ui.geometry.Offset to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
- method public static android.graphics.Shader RadialGradientShader(androidx.ui.geometry.Offset center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader LinearGradientShader-BG1VTC8(long from, long to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
+ method public static android.graphics.Shader RadialGradientShader-nSjqbmE(long center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
}
public final class Shadow {
method public long component1();
- method public androidx.ui.geometry.Offset component2();
+ method public long component2();
method public float component3();
- method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, androidx.ui.geometry.Offset offset, float blurRadius);
+ method public androidx.ui.graphics.Shadow copy-1LPazZ4(long color, long offset, float blurRadius);
method public float getBlurRadius();
method public long getColor();
- method public androidx.ui.geometry.Offset getOffset();
+ method public long getOffset();
field public static final androidx.ui.graphics.Shadow.Companion! Companion;
}
@@ -482,10 +487,8 @@
method public androidx.ui.graphics.Outline createOutline(androidx.ui.unit.PxSize size, androidx.ui.unit.Density density);
}
- public final class SolidColor implements androidx.ui.graphics.Brush {
+ public final class SolidColor extends androidx.ui.graphics.Brush {
method public void applyTo(androidx.ui.graphics.Paint p);
- method public long component1();
- method public androidx.ui.graphics.SolidColor copy-QEYXlZo(long value);
method public long getValue();
}
@@ -715,39 +718,102 @@
package androidx.ui.graphics.painter {
+ public final class CanvasScope {
+ ctor public CanvasScope();
+ method public void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+ method public long getCenter();
+ method public long getSize();
+ property public final long center;
+ property public final long size;
+ field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
+ field public static final float DefaultAlpha = 1.0f;
+ }
+
+ public static final class CanvasScope.Companion {
+ method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
+ property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
+ }
+
+ public final class CanvasScopeKt {
+ method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? clipRect-2CUYwUY(androidx.ui.graphics.painter.CanvasScope, long topLeft = Offset.zero, long size = this.size, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline void inset(androidx.ui.graphics.painter.CanvasScope, float dx, float dy = dx, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float dx, float dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
+ }
+
public final class ColorPainter extends androidx.ui.graphics.painter.Painter {
method public long component1();
method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
method public long getColor();
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
+ public abstract sealed class DrawStyle {
+ }
+
+ public final class Fill extends androidx.ui.graphics.painter.DrawStyle {
+ field public static final androidx.ui.graphics.painter.Fill! INSTANCE;
+ }
+
public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
- ctor public ImagePainter(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
- method public androidx.ui.geometry.Rect? component2();
- method public androidx.ui.graphics.painter.ImagePainter copy(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Rect? srcBounds);
+ method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
method public androidx.ui.unit.PxSize getIntrinsicSize();
- method public androidx.ui.geometry.Rect? getSrcBounds();
- method protected void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public androidx.ui.unit.PxSize intrinsicSize;
}
- public final class ImagePainterKt {
- }
-
public abstract class Painter {
ctor public Painter();
method protected boolean applyAlpha(float alpha);
method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
method protected boolean applyRtl(boolean rtl);
- method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+ method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
- method protected abstract void onDraw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize bounds);
+ method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
property public abstract androidx.ui.unit.PxSize intrinsicSize;
}
+ public final class Stroke extends androidx.ui.graphics.painter.DrawStyle {
+ ctor public Stroke(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ ctor public Stroke();
+ method public float component1();
+ method public float component2();
+ method public androidx.ui.graphics.StrokeCap component3();
+ method public androidx.ui.graphics.StrokeJoin component4();
+ method public android.graphics.PathEffect? component5();
+ method public androidx.ui.graphics.painter.Stroke copy(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
+ method public androidx.ui.graphics.StrokeCap getCap();
+ method public androidx.ui.graphics.StrokeJoin getJoin();
+ method public float getMiter();
+ method public android.graphics.PathEffect? getPathEffect();
+ method public float getWidth();
+ }
+
}
package androidx.ui.graphics.vector {
@@ -1144,7 +1210,7 @@
method public static androidx.ui.geometry.Rect inverseTransformRect(androidx.ui.graphics.vectormath.Matrix4 transform, androidx.ui.geometry.Rect rect);
method public static boolean isIdentity(androidx.ui.graphics.vectormath.Matrix4);
method public static boolean matrixEquals(androidx.ui.graphics.vectormath.Matrix4? a, androidx.ui.graphics.vectormath.Matrix4? b);
- method public static androidx.ui.geometry.Offset transformPoint(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Offset point);
+ method public static long transformPoint-k2M_ft0(androidx.ui.graphics.vectormath.Matrix4, long point);
method public static androidx.ui.geometry.Rect transformRect(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Rect rect);
}
diff --git a/ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/CanvasScopeSample.kt b/ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/CanvasScopeSample.kt
new file mode 100644
index 0000000..52d556a
--- /dev/null
+++ b/ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/CanvasScopeSample.kt
@@ -0,0 +1,63 @@
+/*
+ * 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.ui.graphics.samples
+
+import androidx.annotation.Sampled
+import androidx.ui.graphics.Canvas
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.ImageAsset
+import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.inset
+import androidx.ui.graphics.painter.rotate
+import androidx.ui.unit.Px
+import androidx.ui.unit.PxSize
+
+/**
+ * Sample showing how to use CanvasScope to issue drawing commands into
+ * a given canvas as well as providing transformations to the drawing environment
+ */
+@Sampled
+fun canvasScopeSample() {
+ val pxSize = PxSize(Px(300.0f), Px(300.0f))
+ val imageAsset = ImageAsset(
+ pxSize.width.value.toInt(),
+ pxSize.height.value.toInt()
+ )
+
+ // create a Canvas to draw contents into the ImageAsset
+ val targetCanvas = Canvas(imageAsset)
+
+ // Create a CanvasScope from this canvas to issue drawing commands into
+ CanvasScope().draw(targetCanvas, pxSize) {
+ drawRect(color = Color.Gray) // Draw grey background
+ // Inset content by 10 pixels on the left/right sides and 12 by the
+ // top/bottom
+ inset(10.0f, 12.0f) {
+ val quadrantSize = size / 2.0f
+
+ // Draw a rectangle within the inset bounds
+ drawRect(
+ size = quadrantSize,
+ color = Color.Red
+ )
+
+ rotate(45.0f) {
+ drawRect(size = quadrantSize, color = Color.Blue)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/CanvasScopeTest.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/CanvasScopeTest.kt
new file mode 100644
index 0000000..eea60cd
--- /dev/null
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/CanvasScopeTest.kt
@@ -0,0 +1,464 @@
+/*
+ * 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.ui.graphics.painter
+
+import androidx.test.filters.SmallTest
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Size
+import androidx.ui.graphics.Canvas
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.ImageAsset
+import androidx.ui.graphics.Paint
+import androidx.ui.graphics.SolidColor
+import androidx.ui.graphics.compositeOver
+import androidx.ui.graphics.toPixelMap
+import androidx.ui.unit.Px
+import androidx.ui.unit.PxSize
+import org.junit.Assert.assertEquals
+import org.junit.Assert.fail
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@SmallTest
+@RunWith(JUnit4::class)
+class CanvasScopeTest {
+
+ private val width: Int = 100
+ private val height: Int = 100
+ private val dstSize = PxSize(Px(width.toFloat()), Px(height.toFloat()))
+
+ private fun createTestDstImage(): ImageAsset {
+ val dst = ImageAsset(width, height)
+ val dstCanvas = Canvas(dst)
+ val dstPaint = Paint().apply {
+ this.color = Color.White
+ }
+ dstCanvas.drawRect(
+ Rect.fromLTWH(0.0f, 0.0f, 200.0f, 200.0f),
+ dstPaint
+ )
+ return dst
+ }
+
+ @Test
+ fun testDrawRectColor() {
+ val img = createTestDstImage()
+ CanvasScope().draw(Canvas(img), dstSize) {
+ // Verify that the overload that consumes a color parameter
+ // fills the canvas with red color
+ drawRect(color = Color.Red)
+ }
+
+ val pixelMap = img.toPixelMap()
+ for (i in 0 until pixelMap.width) {
+ for (j in 0 until pixelMap.height) {
+ assertEquals(Color.Red, pixelMap[i, j])
+ }
+ }
+ }
+
+ @Test
+ fun testDrawRectBrushColor() {
+ val img = createTestDstImage()
+ CanvasScope().draw(Canvas(img), dstSize) {
+ // Verify that the overload that consumes a brush parameter
+ // fills the canvas with red color
+ drawRect(brush = SolidColor(Color.Red))
+ }
+
+ val pixelMap = img.toPixelMap()
+ for (i in 0 until pixelMap.width) {
+ for (j in 0 until pixelMap.height) {
+ assertEquals(Color.Red, pixelMap[i, j])
+ }
+ }
+ }
+
+ @Test
+ fun testDrawRectColorAlpha() {
+ val img = createTestDstImage()
+ CanvasScope().draw(Canvas(img), dstSize) {
+ // Verify that the overload that consumes a color parameter
+ // fills the canvas with red color
+ drawRect(color = Color.Red, alpha = 0.5f)
+ }
+
+ val expected = Color(
+ alpha = 0.5f,
+ red = Color.Red.red,
+ green = Color.Red.green,
+ blue = Color.Red.blue
+ ).compositeOver(Color.White)
+
+ val pixelMap = img.toPixelMap()
+ for (i in 0 until pixelMap.width) {
+ for (j in 0 until pixelMap.height) {
+ val result = pixelMap[i, j]
+ assertEquals(expected.red, result.red, 0.01f)
+ assertEquals(expected.green, result.green, 0.01f)
+ assertEquals(expected.blue, result.blue, 0.01f)
+ assertEquals(expected.alpha, result.alpha, 0.01f)
+ }
+ }
+ }
+
+ @Test
+ fun testDrawRectBrushColorAlpha() {
+ val img = createTestDstImage()
+ CanvasScope().draw(Canvas(img), dstSize) {
+ // Verify that the overload that consumes a brush parameter
+ // fills the canvas with red color
+ drawRect(brush = SolidColor(Color.Red), alpha = 0.5f)
+ }
+
+ val expected = Color(
+ alpha = 0.5f,
+ red = Color.Red.red,
+ green = Color.Red.green,
+ blue = Color.Red.blue
+ ).compositeOver(Color.White)
+
+ val pixelMap = img.toPixelMap()
+ for (i in 0 until pixelMap.width) {
+ for (j in 0 until pixelMap.height) {
+ val result = pixelMap[i, j]
+ assertEquals(expected.red, result.red, 0.01f)
+ assertEquals(expected.green, result.green, 0.01f)
+ assertEquals(expected.blue, result.blue, 0.01f)
+ assertEquals(expected.alpha, result.alpha, 0.01f)
+ }
+ }
+ }
+
+ @Test
+ fun testDrawTranslatedRect() {
+ val img = createTestDstImage()
+ val insetLeft = 10.0f
+ val insetTop = 12.0f
+ CanvasScope().draw(Canvas(img), dstSize) {
+ translate(insetLeft, insetTop) {
+ drawRect(color = Color.Red)
+ }
+ }
+
+ val pixelMap = img.toPixelMap()
+ for (i in 0 until pixelMap.width) {
+ for (j in 0 until pixelMap.height) {
+ val expectedColor =
+ if (i >= insetLeft && j >= insetTop) {
+ Color.Red
+ } else {
+ Color.White
+ }
+ assertEquals("Coordinate: " + i + ", " + j, expectedColor, pixelMap[i, j])
+ }
+ }
+ }
+
+ @Test
+ fun testDrawInsetRect() {
+ val img = createTestDstImage()
+ val insetLeft = 10.0f
+ val insetTop = 12.0f
+ val insetRight = 11.0f
+ val insetBottom = 13.0f
+ CanvasScope().draw(Canvas(img), dstSize) {
+ inset(insetLeft, insetTop, insetRight, insetBottom) {
+ drawRect(color = Color.Red)
+ }
+ }
+
+ val pixelMap = img.toPixelMap()
+ for (i in 0 until pixelMap.width) {
+ for (j in 0 until pixelMap.height) {
+ val expectedColor =
+ if (i >= insetLeft && i < pixelMap.width - insetRight &&
+ j >= insetTop && j < pixelMap.height - insetBottom) {
+ Color.Red
+ } else {
+ Color.White
+ }
+ assertEquals("Coordinate: " + i + ", " + j, expectedColor, pixelMap[i, j])
+ }
+ }
+ }
+
+ @Test
+ fun testInsetRestoredAfterScopedInsetDraw() {
+ val img = createTestDstImage()
+ CanvasScope().draw(Canvas(img), dstSize) {
+ // Verify that the overload that consumes a color parameter
+ // fills the canvas with red color
+ val left = 10.0f
+ val top = 30.0f
+ val right = 20.0f
+ val bottom = 12.0f
+ inset(left, top, right, bottom) {
+ drawRect(color = Color.Red)
+ assertEquals(dstSize.width.value - (left + right), size.width)
+ assertEquals(dstSize.height.value - (top + bottom), size.height)
+ }
+
+ assertEquals(dstSize.width.value, size.width)
+ assertEquals(dstSize.height.value, size.height)
+ }
+ }
+
+ @Test
+ fun testFillOverwritesOldAlpha() {
+ val img = createTestDstImage()
+ CanvasScope().draw(Canvas(img), dstSize) {
+ // Verify that the alpha parameter used in the first draw call is overridden
+ // in the subsequent call that does not specify an alpha value
+ drawRect(color = Color.Blue, alpha = 0.5f)
+ drawRect(color = Color.Red)
+ }
+
+ val pixelMap = img.toPixelMap()
+ for (i in 0 until pixelMap.width) {
+ for (j in 0 until pixelMap.height) {
+ assertEquals(Color.Red, pixelMap[i, j])
+ }
+ }
+ }
+
+ @Test
+ fun testFillOverwritesOldPaintBrushAlpha() {
+ val img = createTestDstImage()
+ CanvasScope().draw(Canvas(img), dstSize) {
+ // Verify that the alpha parameter used in the first draw call is overridden
+ // in the subsequent call that does not specify an alpha value that goes through
+ // a different code path for configuration of the underlying paint
+ drawRect(color = Color.Blue, alpha = 0.5f)
+ drawRect(brush = SolidColor(Color.Red))
+ }
+
+ val pixelMap = img.toPixelMap()
+ for (i in 0 until pixelMap.width) {
+ for (j in 0 until pixelMap.height) {
+ assertEquals(Color.Red, pixelMap[i, j])
+ }
+ }
+ }
+
+ @Test
+ fun testScaleTopLeftPivot() {
+ val canvasScope = CanvasScope()
+
+ val width = 200
+ val height = 200
+ val size = PxSize(Px(width.toFloat()), Px(height.toFloat()))
+ val imageAsset = ImageAsset(width, height)
+
+ canvasScope.draw(Canvas(imageAsset), size) {
+ drawRect(color = Color.Red)
+ scale(0.5f, 0.5f, pivotX = 0.0f, pivotY = 0.0f) {
+ drawRect(color = Color.Blue)
+ }
+ }
+
+ val pixelMap = imageAsset.toPixelMap()
+ assertEquals(Color.Blue, pixelMap[0, 0])
+ assertEquals(Color.Blue, pixelMap[99, 0])
+ assertEquals(Color.Blue, pixelMap[0, 99])
+ assertEquals(Color.Blue, pixelMap[99, 99])
+
+ assertEquals(Color.Red, pixelMap[0, 100])
+ assertEquals(Color.Red, pixelMap[100, 0])
+ assertEquals(Color.Red, pixelMap[100, 100])
+ assertEquals(Color.Red, pixelMap[100, 99])
+ assertEquals(Color.Red, pixelMap[99, 100])
+ }
+
+ @Test
+ fun testScaleCenterDefaultPivot() {
+ val canvasScope = CanvasScope()
+
+ val width = 200
+ val height = 200
+ val size = PxSize(Px(width.toFloat()), Px(height.toFloat()))
+ val imageAsset = ImageAsset(width, height)
+
+ canvasScope.draw(Canvas(imageAsset), size) {
+ drawRect(color = Color.Red)
+ scale(0.5f, 0.5f) {
+ drawRect(color = Color.Blue)
+ }
+ }
+
+ val pixelMap = imageAsset.toPixelMap()
+ val left = width / 2 - 50
+ val top = height / 2 - 50
+ val right = width / 2 + 50 - 1
+ val bottom = height / 2 + 50 - 1
+ assertEquals(Color.Blue, pixelMap[left, top])
+ assertEquals(Color.Blue, pixelMap[right, top])
+ assertEquals(Color.Blue, pixelMap[left, bottom])
+ assertEquals(Color.Blue, pixelMap[right, bottom])
+
+ assertEquals(Color.Red, pixelMap[left - 1, top - 1])
+ assertEquals(Color.Red, pixelMap[left - 1, top])
+ assertEquals(Color.Red, pixelMap[left, top - 1])
+
+ assertEquals(Color.Red, pixelMap[right + 1, top - 1])
+ assertEquals(Color.Red, pixelMap[right + 1, top])
+ assertEquals(Color.Red, pixelMap[right, top - 1])
+
+ assertEquals(Color.Red, pixelMap[left - 1, bottom + 1])
+ assertEquals(Color.Red, pixelMap[left - 1, bottom])
+ assertEquals(Color.Red, pixelMap[left, bottom + 1])
+
+ assertEquals(Color.Red, pixelMap[right + 1, bottom + 1])
+ assertEquals(Color.Red, pixelMap[right + 1, bottom])
+ assertEquals(Color.Red, pixelMap[right, bottom + 1])
+ }
+
+ @Test
+ fun testInsetNegativeWidthThrows() {
+ val canvasScope = CanvasScope()
+
+ val width = 200
+ val height = 200
+ val size = PxSize(Px(width.toFloat()), Px(height.toFloat()))
+ val imageAsset = ImageAsset(width, height)
+
+ try {
+ canvasScope.draw(Canvas(imageAsset), size) {
+ inset(100.0f, 0.0f, 100.0f, 0.0f) {
+ drawRect(color = Color.Red)
+ }
+ }
+ fail("Width must be greater than zero after applying inset")
+ } catch (e: IllegalArgumentException) {
+ // no-op
+ }
+ }
+
+ @Test
+ fun testInsetNegativeHeightThrows() {
+ val canvasScope = CanvasScope()
+
+ val width = 200
+ val height = 200
+ val size = PxSize(Px(width.toFloat()), Px(height.toFloat()))
+ val imageAsset = ImageAsset(width, height)
+
+ try {
+ canvasScope.draw(Canvas(imageAsset), size) {
+ inset(0.0f, 100.0f, 0.0f, 100.0f) {
+ drawRect(color = Color.Red)
+ }
+ }
+ fail("Height must be greater than zero after applying inset")
+ } catch (e: IllegalArgumentException) {
+ // no-op
+ }
+ }
+
+ @Test
+ fun testScaleBottomRightPivot() {
+ val canvasScope = CanvasScope()
+
+ val width = 200
+ val height = 200
+ val size = PxSize(Px(width.toFloat()), Px(height.toFloat()))
+ val imageAsset = ImageAsset(width, height)
+
+ canvasScope.draw(Canvas(imageAsset), size) {
+ drawRect(color = Color.Red)
+ scale(0.5f, 0.5f, width.toFloat(), height.toFloat()) {
+ drawRect(color = Color.Blue)
+ }
+ }
+
+ val pixelMap = imageAsset.toPixelMap()
+
+ val left = width - 100
+ val top = height - 100
+ val right = width - 1
+ val bottom = height - 1
+ assertEquals(Color.Blue, pixelMap[left, top])
+ assertEquals(Color.Blue, pixelMap[right, top])
+ assertEquals(Color.Blue, pixelMap[left, bottom])
+ assertEquals(Color.Blue, pixelMap[left, right])
+
+ assertEquals(Color.Red, pixelMap[left, top - 1])
+ assertEquals(Color.Red, pixelMap[left - 1, top])
+ assertEquals(Color.Red, pixelMap[left - 1, top - 1])
+
+ assertEquals(Color.Red, pixelMap[right, top - 1])
+ assertEquals(Color.Red, pixelMap[left - 1, bottom])
+ }
+
+ @Test
+ fun testRotationCenterPivot() {
+ val width = 200
+ val height = 200
+ val size = PxSize(Px(width.toFloat()), Px(height.toFloat()))
+ val imageAsset = ImageAsset(width, height)
+ CanvasScope().draw(Canvas(imageAsset), size) {
+ drawRect(color = Color.Red)
+ rotate(180.0f) {
+ drawRect(
+ topLeft = Offset(100.0f, 100.0f),
+ size = Size(100.0f, 100.0f),
+ color = Color.Blue
+ )
+ }
+ }
+
+ val pixelMap = imageAsset.toPixelMap()
+ assertEquals(Color.Blue, pixelMap[0, 0])
+ assertEquals(Color.Blue, pixelMap[99, 0])
+ assertEquals(Color.Blue, pixelMap[0, 99])
+ assertEquals(Color.Blue, pixelMap[99, 99])
+
+ assertEquals(Color.Red, pixelMap[0, 100])
+ assertEquals(Color.Red, pixelMap[100, 0])
+ assertEquals(Color.Red, pixelMap[100, 100])
+ assertEquals(Color.Red, pixelMap[100, 99])
+ assertEquals(Color.Red, pixelMap[99, 100])
+ }
+
+ @Test
+ fun testRotationTopLeftPivot() {
+ val width = 200
+ val height = 200
+ val size = PxSize(Px(width.toFloat()), Px(height.toFloat()))
+ val imageAsset = ImageAsset(width, height)
+ CanvasScope().draw(Canvas(imageAsset), size) {
+ drawRect(color = Color.Red)
+ rotate(-45.0f, 0.0f, 0.0f) {
+ drawRect(
+ size = Size(100.0f, 100.0f),
+ color = Color.Blue
+ )
+ }
+ }
+
+ val pixelMap = imageAsset.toPixelMap()
+ assertEquals(Color.Blue, pixelMap[2, 0])
+ assertEquals(Color.Blue, pixelMap[50, 49])
+ assertEquals(Color.Blue, pixelMap[70, 0])
+ assertEquals(Color.Blue, pixelMap[70, 68])
+
+ assertEquals(Color.Red, pixelMap[50, 51])
+ assertEquals(Color.Red, pixelMap[75, 76])
+ }
+}
\ No newline at end of file
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt
index 630ce2e..9269351 100644
--- a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt
@@ -17,7 +17,9 @@
package androidx.ui.graphics.painter
import androidx.test.filters.SmallTest
+import androidx.ui.geometry.Offset
import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Size
import androidx.ui.graphics.BlendMode
import androidx.ui.graphics.Canvas
import androidx.ui.graphics.Color
@@ -131,7 +133,8 @@
val canvas = Canvas(dst)
val topLeftPainter = ImagePainter(srcImage,
- Rect.fromLTWH(0.0f, 0.0f, 50.0f, 50.0f) // Top Left
+ srcOffset = Offset.zero,
+ srcSize = Size(50.0f, 50.0f)
)
val intrinsicSize = topLeftPainter.intrinsicSize
@@ -146,7 +149,8 @@
assertEquals(Color.Red, topLeftMap[49, 49])
val topRightPainter = ImagePainter(srcImage,
- Rect.fromLTWH(50.0f, 0.0f, 50.0f, 50.0f)
+ srcOffset = Offset(50.0f, 0.0f),
+ srcSize = Size(50.0f, 50.0f)
)
val topRightDst = createTestDstImage()
@@ -158,7 +162,8 @@
assertEquals(Color.Blue, topRightMap[49, 49])
val bottomLeftPainter = ImagePainter(srcImage,
- Rect.fromLTWH(0.0f, 50.0f, 50.0f, 50.0f) // Bottom left
+ srcOffset = Offset(0.0f, 50.0f),
+ srcSize = Size(50.0f, 50.0f)
)
bottomLeftPainter.draw(canvas, bottomLeftPainter.intrinsicSize)
@@ -170,7 +175,8 @@
assertEquals(Color.Blue, bottomLeftMap[49, 49])
val bottomRightPainter = ImagePainter(srcImage,
- Rect.fromLTWH(50.0f, 50.0f, 50.0f, 50.0f)
+ srcOffset = Offset(50.0f, 50.0f),
+ srcSize = Size(50.0f, 50.0f)
)
bottomRightPainter.draw(canvas, bottomRightPainter.intrinsicSize)
@@ -186,7 +192,9 @@
fun testInvalidLeftBoundThrows() {
try {
ImagePainter(createTestSrcImage(),
- Rect.fromLTWH(-1.0f, 0.0f, 10.0f, 10.0f))
+ Offset(-1.0f, 1.0f),
+ Size(10.0f, 10.0f)
+ )
fail("Left bound must be greater than or equal to zero")
} catch (e: IllegalArgumentException) {
// no-op
@@ -197,7 +205,9 @@
fun testInvalidTopBoundThrows() {
try {
ImagePainter(createTestSrcImage(),
- Rect.fromLTWH(0.0f, -1.0f, 10.0f, 10.0f))
+ Offset(0.0f, -1.0f),
+ Size(10.0f, 10.0f)
+ )
fail("Top bound must be greater than or equal to zero")
} catch (e: IllegalArgumentException) {
// no-op
@@ -209,7 +219,9 @@
try {
val image = createTestSrcImage()
ImagePainter(image,
- Rect.fromLTWH(0.0f, 0.0f, image.width + 1.0f, 10.0f))
+ Offset(0.0f, 0.0f),
+ Size(image.width + 1.0f, 10.0f)
+ )
fail("Right bound must be less than ImageAsset width")
} catch (e: IllegalArgumentException) {
// no-op
@@ -221,7 +233,9 @@
try {
val image = createTestSrcImage()
ImagePainter(image,
- Rect.fromLTWH(0.0f, 0.0f, 10.0f, image.height + 1.0f))
+ Offset(0.0f, 0.0f),
+ Size(10.0f, image.height + 1.0f)
+ )
fail("Bottom bound must be less than ImageAsset height")
} catch (e: IllegalArgumentException) {
// no-op
@@ -232,7 +246,9 @@
fun testRightLessThanLeftThrows() {
try {
ImagePainter(createTestSrcImage(),
- Rect.fromLTRB(50.0f, 0.0f, 10.0f, 10.0f))
+ Offset(50.0f, 0.0f),
+ Size(-40.0f, 10.0f)
+ )
fail("Right bound must be greater than left bound")
} catch (e: IllegalArgumentException) {
// no-op
@@ -243,7 +259,9 @@
fun testTopLessThanBottomThrows() {
try {
ImagePainter(createTestSrcImage(),
- Rect.fromLTRB(0.0f, 100.0f, 10.0f, 10.0f))
+ Offset(0.0f, 100.0f),
+ Size(-90.0f, -90.0f)
+ )
fail("Bottom bound must be larger than top bound")
} catch (e: IllegalArgumentException) {
// no-op
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt
index 35843f72..0407a9e 100644
--- a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt
@@ -50,7 +50,7 @@
override val intrinsicSize: PxSize
get() = size
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
+ override fun CanvasScope.onDraw() {
didDraw = true
}
}
@@ -66,21 +66,18 @@
fun testPainterRtl() {
val p = object : Painter() {
- private val paint = Paint().apply { this.color = Color.Cyan }
+ var color = Color.Black
override val intrinsicSize: PxSize
get() = size
override fun applyRtl(rtl: Boolean): Boolean {
- paint.color = if (rtl) Color.Red else Color.Cyan
+ color = if (rtl) Color.Red else Color.Cyan
return true
}
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
- canvas.drawRect(
- Rect.fromLTWH(0.0f, 0.0f, 100.0f, 100.0f),
- paint
- )
+ override fun CanvasScope.onDraw() {
+ drawRect(color = color)
}
}
@@ -98,18 +95,11 @@
fun testPainterAlpha() {
val p = object : Painter() {
- val paint = Paint().apply {
- this.color = Color.Red
- }
-
override val intrinsicSize: PxSize
get() = size
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
- canvas.drawRect(
- Rect.fromLTWH(0.0f, 0.0f, bounds.width.value, bounds.height.value),
- paint
- )
+ override fun CanvasScope.onDraw() {
+ drawRect(color = Color.Red)
}
}
@@ -138,12 +128,10 @@
fun testPainterCustomAlpha() {
val p = object : Painter() {
- val paint = Paint().apply {
- this.color = Color.Red
- }
+ var color = Color.Red
override fun applyAlpha(alpha: Float): Boolean {
- paint.color =
+ color =
Color(
alpha = alpha,
red = Color.Red.red,
@@ -156,15 +144,12 @@
override val intrinsicSize: PxSize
get() = size
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
- canvas.drawRect(
- Rect.fromLTWH(0.0f, 0.0f, bounds.width.value, bounds.height.value),
- paint
- )
+ override fun CanvasScope.onDraw() {
+ drawRect(color = color)
}
}
- assertEquals(Color.Red, p.paint.color)
+ assertEquals(Color.Red, p.color)
val image = ImageAsset(100, 100)
val canvas = Canvas(image)
@@ -190,23 +175,18 @@
fun testColorFilter() {
val p = object : Painter() {
- val paint = Paint().apply {
- colorFilter = ColorFilter(Color.Red, BlendMode.srcIn)
- }
+ var colorFilter: ColorFilter? = ColorFilter(Color.Red, BlendMode.srcIn)
override fun applyColorFilter(colorFilter: ColorFilter?): Boolean {
- paint.colorFilter = colorFilter
+ this.colorFilter = colorFilter
return true
}
override val intrinsicSize: PxSize
get() = size
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
- canvas.drawRect(
- Rect.fromLTWH(0.0f, 0.0f, bounds.width.value, bounds.height.value),
- paint
- )
+ override fun CanvasScope.onDraw() {
+ drawRect(color = Color.Black, colorFilter = colorFilter)
}
}
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidCanvas.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidCanvas.kt
index ef010da..c962b99 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidCanvas.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/AndroidCanvas.kt
@@ -17,11 +17,9 @@
package androidx.ui.graphics
import android.graphics.Matrix
-import androidx.ui.core.toAndroidRect
-import androidx.ui.core.toAndroidRectF
import androidx.ui.geometry.Offset
-import androidx.ui.geometry.RRect
import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Size
import androidx.ui.graphics.vectormath.Matrix4
import androidx.ui.graphics.vectormath.isIdentity
@@ -51,12 +49,15 @@
fun Canvas(c: android.graphics.Canvas): Canvas =
AndroidCanvas(c)
-private class AndroidCanvas(val internalCanvas: android.graphics.Canvas) :
- Canvas {
+private class AndroidCanvas(val internalCanvas: android.graphics.Canvas) : Canvas {
- private val internalPath = Path()
+ private val srcRect: android.graphics.Rect by lazy(LazyThreadSafetyMode.NONE) {
+ android.graphics.Rect()
+ }
- private val internalRectF = android.graphics.RectF()
+ private val dstRect: android.graphics.Rect by lazy(LazyThreadSafetyMode.NONE) {
+ android.graphics.Rect()
+ }
/**
* @see Canvas.save
@@ -150,30 +151,17 @@
}
}
- /**
- * @see Canvas.clipRect
- */
@SuppressWarnings("deprecation")
- override fun clipRect(rect: Rect, clipOp: ClipOp) {
- val frameworkRect = rect.toAndroidRect()
+ override fun clipRect(left: Float, top: Float, right: Float, bottom: Float, clipOp: ClipOp) {
@Suppress("DEPRECATION")
when (clipOp) {
- ClipOp.intersect -> internalCanvas.clipRect(frameworkRect)
- ClipOp.difference -> internalCanvas.clipRect(frameworkRect,
+ ClipOp.intersect -> internalCanvas.clipRect(left, top, right, bottom)
+ ClipOp.difference -> internalCanvas.clipRect(left, top, right, bottom,
android.graphics.Region.Op.DIFFERENCE)
}
}
/**
- * @see Canvas.clipRRect
- */
- override fun clipRRect(rrect: RRect) {
- internalPath.reset()
- internalPath.addRRect(rrect)
- clipPath(internalPath)
- }
-
- /**
* @see Canvas.clipPath
*/
override fun clipPath(path: Path) {
@@ -193,11 +181,8 @@
)
}
- /**
- * @see Canvas.drawRect
- */
- override fun drawRect(rect: Rect, paint: Paint) {
- internalCanvas.drawRect(rect.toAndroidRectF(), paint.asFrameworkPaint())
+ override fun drawRect(left: Float, top: Float, right: Float, bottom: Float, paint: Paint) {
+ internalCanvas.drawRect(left, top, right, bottom, paint.asFrameworkPaint())
}
override fun drawRoundRect(
@@ -220,13 +205,8 @@
)
}
- /**
- * @see Canvas.drawOval
- */
- override fun drawOval(rect: Rect, paint: Paint) {
- internalRectF.set(rect.toAndroidRect())
- internalCanvas.drawOval(internalRectF,
- paint.asFrameworkPaint())
+ override fun drawOval(left: Float, top: Float, right: Float, bottom: Float, paint: Paint) {
+ internalCanvas.drawOval(left, top, right, bottom, paint.asFrameworkPaint())
}
/**
@@ -241,19 +221,21 @@
)
}
- /**
- * @see Canvas.drawArc
- */
override fun drawArc(
- rect: Rect,
+ left: Float,
+ top: Float,
+ right: Float,
+ bottom: Float,
startAngle: Float,
sweepAngle: Float,
useCenter: Boolean,
paint: Paint
) {
- internalRectF.set(rect.toAndroidRect())
internalCanvas.drawArc(
- internalRectF,
+ left,
+ top,
+ right,
+ bottom,
startAngle,
sweepAngle,
useCenter,
@@ -283,11 +265,31 @@
/**
* @See Canvas.drawImageRect
*/
- override fun drawImageRect(image: ImageAsset, src: Rect?, dst: Rect, paint: Paint) {
+ override fun drawImageRect(
+ image: ImageAsset,
+ srcOffset: Offset,
+ srcSize: Size,
+ dstOffset: Offset,
+ dstSize: Size,
+ paint: Paint
+ ) {
+ // There is no framework API to draw a subset of a target bitmap
+ // that consumes only primitives so lazily allocate a src and dst
+ // rect to populate the dimensions and re-use across calls
internalCanvas.drawBitmap(
image.asAndroidBitmap(),
- src?.toAndroidRect(),
- dst.toAndroidRect(),
+ srcRect.apply {
+ left = srcOffset.dx.toInt()
+ top = srcOffset.dy.toInt()
+ right = (srcOffset.dx + srcSize.width).toInt()
+ bottom = (srcOffset.dy + srcSize.height).toInt()
+ },
+ dstRect.apply {
+ left = dstOffset.dx.toInt()
+ top = dstOffset.dy.toInt()
+ right = (dstOffset.dx + dstSize.width).toInt()
+ bottom = (dstOffset.dy + dstSize.height).toInt()
+ },
paint.asFrameworkPaint()
)
}
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/Brush.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/Brush.kt
index 02a793a..bccb1c8 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/Brush.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/Brush.kt
@@ -19,13 +19,14 @@
import androidx.ui.geometry.Offset
import androidx.ui.unit.Px
-interface Brush {
- fun applyTo(p: Paint)
+sealed class Brush {
+ abstract fun applyTo(p: Paint)
}
-data class SolidColor(val value: Color) : Brush {
+class SolidColor(val value: Color) : Brush() {
override fun applyTo(p: Paint) {
- p.color = value
+ if (p.color != value) p.color = value
+ if (p.shader != null) p.shader = null
}
}
@@ -54,8 +55,7 @@
endX: Px,
endY: Px,
tileMode: TileMode = TileMode.Clamp
-): LinearGradient {
- return LinearGradient(
+) = LinearGradient(
colors,
null,
startX,
@@ -64,7 +64,6 @@
endY,
tileMode
)
-}
/**
* Creates a linear gradient with the provided colors along the given start and end coordinates.
@@ -89,8 +88,7 @@
endX: Px,
endY: Px,
tileMode: TileMode = TileMode.Clamp
-): LinearGradient {
- return LinearGradient(
+) = LinearGradient(
List<Color>(colorStops.size) { i -> colorStops[i].second },
List<Float>(colorStops.size) { i -> colorStops[i].first },
startX,
@@ -99,7 +97,6 @@
endY,
tileMode
)
-}
/**
* Creates a radial gradient with the given colors at the provided offset defined in the [ColorStop]
@@ -121,8 +118,7 @@
centerY: Float,
radius: Float,
tileMode: TileMode = TileMode.Clamp
-): RadialGradient {
- return RadialGradient(
+) = RadialGradient(
List<Color>(colorStops.size) { i -> colorStops[i].second },
List<Float>(colorStops.size) { i -> colorStops[i].first },
centerX,
@@ -130,7 +126,6 @@
radius,
tileMode
)
-}
/**
* Creates a radial gradient with the given colors evenly dispersed within the gradient
@@ -152,9 +147,7 @@
centerY: Float,
radius: Float,
tileMode: TileMode = TileMode.Clamp
-): RadialGradient {
- return RadialGradient(colors, null, centerX, centerY, radius, tileMode)
-}
+) = RadialGradient(colors, null, centerX, centerY, radius, tileMode)
/**
* Creates a vertical gradient with the given colors at the provided offset defined in the [ColorStop]
@@ -175,8 +168,7 @@
startY: Px,
endY: Px,
tileMode: TileMode = TileMode.Clamp
-): LinearGradient {
- return LinearGradient(
+) = LinearGradient(
colors,
null,
startX = Px.Zero,
@@ -185,7 +177,6 @@
endY = endY,
tileMode = tileMode
)
-}
/**
* Creates a vertical gradient with the given colors evenly dispersed within the gradient
@@ -205,8 +196,7 @@
startY: Px,
endY: Px,
tileMode: TileMode = TileMode.Clamp
-): LinearGradient {
- return LinearGradient(
+) = LinearGradient(
List<Color>(colorStops.size) { i -> colorStops[i].second },
List<Float>(colorStops.size) { i -> colorStops[i].first },
startX = Px.Zero,
@@ -215,7 +205,6 @@
endY = endY,
tileMode = tileMode
)
-}
/**
* Creates a horizontal gradient with the given colors evenly dispersed within the gradient
@@ -236,8 +225,7 @@
startX: Px,
endX: Px,
tileMode: TileMode = TileMode.Clamp
-): LinearGradient {
- return LinearGradient(
+) = LinearGradient(
colors,
null,
startX = startX,
@@ -246,7 +234,6 @@
endY = Px.Zero,
tileMode = tileMode
)
-}
/**
* Creates a horizontal gradient with the given colors dispersed at the provided offset defined in the [ColorStop]
@@ -298,7 +285,7 @@
stops,
tileMode
)
- )
+)
/**
* Brush implementation used to apply a radial gradient on a given [Paint]
@@ -318,13 +305,14 @@
stops,
tileMode
)
- )
+)
/**
* Brush implementation that wraps and applies a the provided shader to a [Paint]
*/
-open class ShaderBrush(val shader: Shader) : Brush {
- override fun applyTo(p: Paint) {
- p.shader = shader
+open class ShaderBrush(val shader: Shader) : Brush() {
+ final override fun applyTo(p: Paint) {
+ if (p.color != Color.Black) p.color = Color.Black
+ if (p.shader != shader) p.shader = shader
}
}
\ No newline at end of file
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/Canvas.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/Canvas.kt
index 064cdcad..6e54b10 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/Canvas.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/Canvas.kt
@@ -17,8 +17,8 @@
package androidx.ui.graphics
import androidx.ui.geometry.Offset
-import androidx.ui.geometry.RRect
import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Size
import androidx.ui.graphics.vectormath.Matrix4
import androidx.ui.graphics.vectormath.degrees
@@ -33,7 +33,7 @@
*
* A canvas also has a current clip region which is applied to all operations.
* Initially, the clip region is infinite. It can be modified using the
- * [Canvas.clipRect], [Canvas.clipRRect], and [Canvas.clipPath] methods.
+ * [Canvas.clipRect], and [Canvas.clipPath] methods.
*
* The current transform and clip can be saved and restored using the stack
* managed by the [Canvas.save], [Canvas.saveLayer], and [Canvas.restore] methods.
@@ -100,8 +100,7 @@
*
* When a rectangular clip operation (from [Canvas.clipRect]) is not axis-aligned
* with the raster buffer, or when the clip operation is not rectalinear (e.g.
- * because it is a rounded rectangle clip created by [Canvas.clipRRect] or an
- * arbitrarily complicated path clip created by [Canvas.clipPath]), the edge of the
+ * because it is a rounded rectangle clip created by [Canvas.clipPath]), the edge of the
* clip needs to be anti-aliased.
*
* If two draw calls overlap at the edge of such a clipped region, without
@@ -243,8 +242,7 @@
*
* When a rectangular clip operation (from [clipRect]) is not axis-aligned
* with the raster buffer, or when the clip operation is not rectalinear (e.g.
- * because it is a rounded rectangle clip created by [clipRRect] or an
- * arbitrarily complicated path clip created by [clipPath]), the edge of the
+ * because it is a rounded rectangle clip created by [clipPath], the edge of the
* clip needs to be anti-aliased.
*
* If two draw calls overlap at the edge of such a clipped region, without
@@ -258,8 +256,8 @@
*
*
- * (Incidentally, rather than using [clipRRect] to draw
- * rounded rectangles like this, prefer the [drawRoundRect] method.
+ * (Incidentally, rather than using [clipPath] with a rounded rectangle defined in a path to
+ * draw rounded rectangles like this, prefer the [drawRoundRect] method.
*
* ## Performance considerations
*
@@ -350,18 +348,34 @@
* current clip.
*/
@SuppressWarnings("deprecation")
- fun clipRect(rect: Rect, clipOp: ClipOp = ClipOp.intersect)
+ fun clipRect(rect: Rect, clipOp: ClipOp = ClipOp.intersect) =
+ clipRect(rect.left, rect.top, rect.right, rect.bottom, clipOp)
/**
* Reduces the clip region to the intersection of the current clip and the
- * given rounded rectangle.
+ * given bounds.
*
- * If [Paint.isAntiAlias] is true, then the clip will be anti-aliased. If
+ * If the clip is not axis-aligned with the display device, and
+ * [Paint.isAntiAlias] is true, then the clip will be anti-aliased. If
* multiple draw commands intersect with the clip boundary, this can result
* in incorrect blending at the clip boundary. See [saveLayer] for a
- * discussion of how to address that and some examples of using [clipRRect].
+ * discussion of how to address that.
+ *
+ * Use [ClipOp.difference] to subtract the provided rectangle from the
+ * current clip.
+ *
+ * @param left Left bound of the clip region
+ * @param top Top bound of the clip region
+ * @param right Right bound of the clip region
+ * @param bottom Bottom bound of the clip region
*/
- fun clipRRect(rrect: RRect)
+ fun clipRect(
+ left: Float,
+ top: Float,
+ right: Float,
+ bottom: Float,
+ clipOp: ClipOp = ClipOp.intersect
+ )
/**
* Reduces the clip region to the intersection of the current clip and the
@@ -386,7 +400,31 @@
* Draws a rectangle with the given [Paint]. Whether the rectangle is filled
* or stroked (or both) is controlled by [Paint.style].
*/
- fun drawRect(rect: Rect, paint: Paint)
+ fun drawRect(rect: Rect, paint: Paint) = drawRect(
+ left = rect.left,
+ top = rect.top,
+ right = rect.right,
+ bottom = rect.bottom,
+ paint = paint
+ )
+
+ /**
+ * Draws a rectangle with the given [Paint]. Whether the rectangle is filled
+ * or stroked (or both) is controlled by [Paint.style].
+ *
+ * @param left The left bound of the rectangle
+ * @param top The top bound of the rectangle
+ * @param right The right bound of the rectangle
+ * @param bottom The bottom bound of the rectangle
+ * @param paint Paint used to color the rectangle with a fill or stroke
+ */
+ fun drawRect(
+ left: Float,
+ top: Float,
+ right: Float,
+ bottom: Float,
+ paint: Paint
+ )
/**
* Draws a rounded rectangle with the given [Paint]. Whether the rectangle is
@@ -407,7 +445,26 @@
* with the given [Paint]. Whether the oval is filled or stroked (or both) is
* controlled by [Paint.style].
*/
- fun drawOval(rect: Rect, paint: Paint)
+ fun drawOval(rect: Rect, paint: Paint) = drawOval(
+ left = rect.left,
+ top = rect.top,
+ right = rect.right,
+ bottom = rect.bottom,
+ paint = paint
+ )
+
+ /**
+ * Draws an axis-aligned oval that fills the given bounds provided with the given
+ * [Paint]. Whether the rectangle is filled
+ * or stroked (or both) is controlled by [Paint.style].
+ *
+ * @param left The left bound of the rectangle
+ * @param top The top bound of the rectangle
+ * @param right The right bound of the rectangle
+ * @param bottom The bottom bound of the rectangle
+ * @param paint Paint used to color the rectangle with a fill or stroke
+ */
+ fun drawOval(left: Float, top: Float, right: Float, bottom: Float, paint: Paint)
/**
* Draws a circle centered at the point given by the first argument and
@@ -435,6 +492,47 @@
sweepAngle: Float,
useCenter: Boolean,
paint: Paint
+ ) = drawArc(
+ left = rect.left,
+ top = rect.top,
+ right = rect.right,
+ bottom = rect.bottom,
+ startAngle = startAngle,
+ sweepAngle = sweepAngle,
+ useCenter = useCenter,
+ paint = paint
+ )
+
+ /**
+ * Draw an arc scaled to fit inside the given rectangle. It starts from
+ * startAngle degrees around the oval up to startAngle + sweepAngle
+ * degrees around the oval, with zero degrees being the point on
+ * the right hand side of the oval that crosses the horizontal line
+ * that intersects the center of the rectangle and with positive
+ * angles going clockwise around the oval. If useCenter is true, the arc is
+ * closed back to the center, forming a circle sector. Otherwise, the arc is
+ * not closed, forming a circle segment.
+ *
+ * This method is optimized for drawing arcs and should be faster than [Path.arcTo].
+ *
+ * @param left Left bound of the arc
+ * @param top Top bound of the arc
+ * @param right Right bound of the arc
+ * @param bottom Bottom bound of the arc
+ * @param startAngle Starting angle of the arc relative to 3 o'clock
+ * @param sweepAngle Sweep angle in degrees clockwise
+ * @param useCenter Flag indicating whether or not to include the center of the oval in the
+ * arc, and close it if it is being stroked. This will draw a wedge.
+ */
+ fun drawArc(
+ left: Float,
+ top: Float,
+ right: Float,
+ bottom: Float,
+ startAngle: Float,
+ sweepAngle: Float,
+ useCenter: Boolean,
+ paint: Paint
)
/**
@@ -480,12 +578,23 @@
* an applied filter.
*
* @param image ImageAsset to draw
- * @param src Optional rectangular section of the image to draw into the dst
- * @param dst Required rectangular region to draw contents of the [ImageAsset] into. Contents
- * of the subsection provided for [src] will be scaled to fit in the destination bounds
+ * @param srcOffset: Optional offset representing the top left offset of the source image
+ * to draw, this defaults to the origin of [image]
+ * @param srcSize: Optional dimensions of the source image to draw relative to [srcOffset],
+ * this defaults the width and height of [image]
+ * @param dstOffset: Offset representing the top left offset of the destination image
+ * to draw
+ * @param dstSize: Dimensions of the destination to draw
* @param paint Paint used to composite the [ImageAsset] pixels into the canvas
*/
- fun drawImageRect(image: ImageAsset, src: Rect?, dst: Rect, paint: Paint)
+ fun drawImageRect(
+ image: ImageAsset,
+ srcOffset: Offset = Offset.zero,
+ srcSize: Size = Size(image.width.toFloat(), image.height.toFloat()),
+ dstOffset: Offset,
+ dstSize: Size,
+ paint: Paint
+ )
/**
* Draw the given picture onto the canvas. To create a picture, see
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/Outline.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/Outline.kt
index edcd75b..a835ff7 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/Outline.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/Outline.kt
@@ -16,8 +16,14 @@
package androidx.ui.graphics
+import androidx.annotation.FloatRange
+import androidx.ui.geometry.Offset
import androidx.ui.geometry.RRect
import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Size
+import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawStyle
+import androidx.ui.graphics.painter.Fill
/**
* Defines a simple shape, used for bounding graphical regions.
@@ -69,6 +75,132 @@
}
/**
+ * Draws the [Outline] on a [CanvasScope].
+ *
+ * @param outline the outline to draw.
+ * @param color Color applied to the outline when it is drawn
+ * @param alpha Opacity to be applied to outline from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style Specifies whether the outline is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [color] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the outline
+ */
+fun CanvasScope.drawOutline(
+ outline: Outline,
+ color: Color,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = CanvasScope.DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = CanvasScope.DefaultBlendMode
+) = drawOutlineHelper(
+ outline,
+ { rect ->
+ drawRect(color, rect.topLeft(), rect.size(), alpha, style, colorFilter, blendMode)
+ },
+ { rrect ->
+ val radius = rrect.bottomLeftRadiusX
+ drawRoundRect(
+ color = color,
+ topLeft = rrect.topLeft(),
+ size = rrect.size(),
+ radiusX = radius,
+ radiusY = radius,
+ alpha = alpha,
+ style = style,
+ colorFilter = colorFilter,
+ blendMode = blendMode
+ )
+ },
+ { path -> drawPath(path, color, alpha, style, colorFilter, blendMode) }
+ )
+
+/**
+ * Draws the [Outline] on a [CanvasScope].
+ *
+ * @param outline the outline to draw.
+ * @param brush Brush applied to the outline when it is drawn
+ * @param alpha Opacity to be applied to outline from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style Specifies whether the outline is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [Brush] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the outline
+ */
+fun CanvasScope.drawOutline(
+ outline: Outline,
+ brush: Brush,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = CanvasScope.DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = CanvasScope.DefaultBlendMode
+) = drawOutlineHelper(
+ outline,
+ { rect ->
+ drawRect(brush, rect.topLeft(), rect.size(), alpha, style, colorFilter, blendMode)
+ },
+ { rrect ->
+ val radius = rrect.bottomLeftRadiusX
+ drawRoundRect(
+ brush = brush,
+ topLeft = rrect.topLeft(),
+ size = rrect.size(),
+ radiusX = radius,
+ radiusY = radius,
+ alpha = alpha,
+ style = style,
+ colorFilter = colorFilter,
+ blendMode = blendMode
+ )
+ },
+ { path -> drawPath(path, brush, alpha, style, colorFilter, blendMode) }
+ )
+
+/**
+ * Convenience method to obtain an Offset from the Rect's top and left parameters
+ */
+private fun Rect.topLeft(): Offset = Offset(left, top)
+
+/**
+ * Convenience method to obtain a Size from the Rect's width and height
+ */
+private fun Rect.size(): Size = Size(width, height)
+
+/**
+ * Convenience method to obtain an Offset from the RRect's top and left parameters
+ */
+private fun RRect.topLeft(): Offset = Offset(left, top)
+
+/**
+ * Convenience method to obtain a Size from the RRect's width and height parameters
+ */
+private fun RRect.size(): Size = Size(width, height)
+
+/**
+ * Helper method that allows for delegation of appropriate drawing call based on type of
+ * underlying outline shape
+ */
+private inline fun CanvasScope.drawOutlineHelper(
+ outline: Outline,
+ drawRectBlock: CanvasScope.(rect: Rect) -> Unit,
+ drawRoundedRectBlock: CanvasScope.(rrect: RRect) -> Unit,
+ drawPathBlock: CanvasScope.(path: Path) -> Unit
+) = when (outline) {
+ is Outline.Rectangle -> drawRectBlock(outline.rect)
+ is Outline.Rounded -> {
+ val path = outline.roundRectPath
+ // If the rounded rect has a path, then the corner radii are not the same across
+ // each of the corners, so we draw the given path.
+ // If there is no path available, then the corner radii are identical so call the
+ // Canvas primitive for drawing a rounded rectangle
+ if (path != null) {
+ drawPathBlock(path)
+ } else {
+ drawRoundedRectBlock(outline.rrect)
+ }
+ }
+ is Outline.Generic -> drawPathBlock(outline.path)
+ }
+
+/**
* Draws the [Outline] on a [Canvas].
*
* @param outline the outline to draw.
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/CanvasScope.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/CanvasScope.kt
new file mode 100644
index 0000000..9c149ac
--- /dev/null
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/CanvasScope.kt
@@ -0,0 +1,1021 @@
+/*
+ * 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.ui.graphics.painter
+
+import android.graphics.PathEffect
+import androidx.annotation.FloatRange
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
+import androidx.ui.graphics.BlendMode
+import androidx.ui.graphics.Brush
+import androidx.ui.graphics.Canvas
+import androidx.ui.graphics.ClipOp
+import androidx.ui.graphics.Color
+import androidx.ui.graphics.ColorFilter
+import androidx.ui.graphics.ImageAsset
+import androidx.ui.graphics.Paint
+import androidx.ui.graphics.PaintingStyle
+import androidx.ui.graphics.Path
+import androidx.ui.graphics.PointMode
+import androidx.ui.graphics.StrokeCap
+import androidx.ui.graphics.StrokeJoin
+import androidx.ui.graphics.scale
+import androidx.ui.graphics.rotate
+import androidx.ui.graphics.vectormath.degrees
+import androidx.ui.unit.Px
+import androidx.ui.unit.PxSize
+
+/**
+ * Simultaneously translate the [CanvasScope] coordinate space by [left] and [top] as well as modify
+ * the dimensions of the current painting area. This provides a callback to issue more
+ * drawing instructions within the modified coordinate space. This method
+ * modifies the width of the [CanvasScope] to be equivalent to width - (left + right) as well as
+ * height to height - (top + bottom)
+ *
+ * @param left number of pixels to inset the left drawing bound
+ * @param top number of pixels to inset the top drawing bound
+ * @param right number of pixels to inset the right drawing bound
+ * @param block lambda that is called to issue drawing commands within the inset coordinate space
+ */
+inline fun CanvasScope.inset(
+ left: Float,
+ top: Float,
+ right: Float,
+ bottom: Float,
+ block: CanvasScope.() -> Unit
+) {
+ doInset(left, top, right, bottom)
+ block()
+ doInset(-left, -top, -right, -bottom)
+}
+
+/**
+ * Convenience method modifies the [CanvasScope] bounds to inset both left and right bounds by
+ * [dx] as well as the top and bottom by [dy]. If only [dx] is provided, the same inset is applied
+ * to all 4 bounds
+ *
+ * @param dx number of pixels to inset both left and right bounds
+ * @param dy Optional number of pixels to inset both top and bottom bounds, by default this also
+ * insets the top and bottom by [dx] pixels
+ * @param block lambda that is called to issue additional drawing commands within the modified
+ * coordinate space
+ */
+inline fun CanvasScope.inset(dx: Float, dy: Float = dx, block: CanvasScope.() -> Unit) =
+ inset(dx, dy, dx, dy, block)
+
+/**
+ * Translate the coordinate space by the given delta in pixels in both the x and y coordinates
+ * respectively
+ *
+ * @param dx Pixels to translate the coordinate space in the x-axis
+ * @param dy Pixels to translate the coordinate space in the y-axis
+ * @param block lambda that is called to issue drawing commands within the
+ * translated coordinate space
+ */
+inline fun CanvasScope.translate(dx: Float, dy: Float, block: CanvasScope.() -> Unit) =
+ canvas?.apply {
+ translate(dx, dy)
+ block()
+ translate(-dx, -dy)
+ }
+
+/**
+ * Add a rotation (in degrees clockwise) to the current transform at the given pivot point.
+ * The pivot coordinate remains unchanged by the rotation transformation. After the provided
+ * lambda is invoked, the rotation transformation is undone.
+ *
+ * @param degrees to rotate clockwise
+ * @param pivotX The x-coord for the pivot point, defaults to the center of the coordinate space
+ * along the x-axis
+ * @param pivotY The y-coord for the pivot point, defaults to the center of the coordinate space
+ * along the y-axis
+ * @param block lambda that is called to issue drawing commands within the rotated
+ * coordinate space
+ */
+inline fun CanvasScope.rotate(
+ degrees: Float,
+ pivotX: Float = center.dx,
+ pivotY: Float = center.dy,
+ block: CanvasScope.() -> Unit
+) = canvas?.apply {
+ rotate(degrees, pivotX, pivotY)
+ block()
+ rotate(-degrees, pivotX, pivotY)
+ }
+
+/**
+ * Add a rotation (in radians clockwise) to the current transform at the given pivot point.
+ * The pivot coordinate remains unchanged by the rotation transformation
+ *
+ * @param radians to rotate clockwise
+ * @param pivotX The x-coord for the pivot point, defaults to the center of the coordinate space
+ * along the x-axis
+ * @param pivotY The y-coord for the pivot point, defaults to the center of the coordinate space
+ * along the y-axis
+ * @param block lambda that is called to issue drawing commands within the rotated
+ * coordinate space
+ */
+inline fun CanvasScope.rotateRad(
+ radians: Float,
+ pivotX: Float = center.dx,
+ pivotY: Float = center.dy,
+ block: CanvasScope.() -> Unit
+) = rotate(degrees(radians), pivotX, pivotY, block)
+
+/**
+ * Add an axis-aligned scale to the current transform, scaling by the first
+ * argument in the horizontal direction and the second in the vertical
+ * direction at the given pivot coordinate. The pivot coordinate remains
+ * unchanged by the scale transformation.
+ *
+ * If [scaleY] is unspecified, [scaleX] will be used for the scale in both
+ * directions.
+ *
+ * @param scaleX The amount to scale in X
+ * @param scaleY The amount to scale in Y
+ * @param pivotX The x-coord for the pivot point
+ * @param pivotY The y-coord for the pivot point
+ * @param block lambda used to issue drawing commands within the scaled coordinate space
+ */
+inline fun CanvasScope.scale(
+ scaleX: Float,
+ scaleY: Float,
+ pivotX: Float = center.dx,
+ pivotY: Float = center.dy,
+ block: CanvasScope.() -> Unit
+) = canvas?.apply {
+ save()
+ scale(scaleX, scaleY, pivotX, pivotY)
+ block()
+ restore()
+ }
+
+/**
+ * Reduces the clip region to the intersection of the current clip and the
+ * given rectangle indicated by the given [Offset] from the top left as well as
+ * the dimensions of the rectangle represeted by [size].
+ *
+ * Use [ClipOp.difference] to subtract the provided rectangle from the
+ * current clip.
+ *
+ * @param topLeft Offset from the origin of the current translation to clip, defaults to 0, 0
+ * @param size Dimensions of the rectangle to clip, defaults to the current size of the drawing
+ * environment
+ * @param clipOp Clipping operation to conduct on the given bounds, defaults to [ClipOp.intersect]
+ * @param block Lambda callback with this CanvasScope as a receiver scope to issue drawing commands
+ * within the provided clip
+ */
+inline fun CanvasScope.clipRect(
+ topLeft: Offset = Offset.zero,
+ size: Size = this.size,
+ clipOp: ClipOp = ClipOp.intersect,
+ block: CanvasScope.() -> Unit
+) = canvas?.apply {
+ save()
+ clipRect(
+ topLeft.dx,
+ topLeft.dy,
+ topLeft.dx + size.width,
+ topLeft.dy + size.height,
+ clipOp
+ )
+ block()
+ restore()
+ }
+
+/**
+ * Reduces the clip region to the intersection of the current clip and the
+ * given rounded rectangle.
+ *
+ */
+inline fun CanvasScope.clipPath(path: Path, block: CanvasScope.() -> Unit) =
+ canvas?.apply {
+ save()
+ clipPath(path)
+ block()
+ restore()
+ }
+
+/**
+ * Provides access to draw directly with the underlying [Canvas] along with the current
+ * size of the [CanvasScope]. This is helpful for situations
+ * to re-use alternative drawing logic in combination with [CanvasScope]
+ *
+ * @param block Lambda callback to issue drawing commands on the provided [Canvas] and given size
+ */
+inline fun CanvasScope.drawCanvas(block: (Canvas, PxSize) -> Unit) =
+ canvas?.let {
+ block(it, PxSize(Px(size.width), Px(size.height)))
+ }
+
+/**
+ * Creates a scoped drawing environment with the provided [Canvas]. This provides a
+ * declarative, stateless API to draw shapes and paths without requiring
+ * consumers to maintain underlying [Canvas] state information.
+ * The bounds for drawing within [CanvasScope] are provided by the call to
+ * [CanvasScope.draw] and are always bound to the local translation. That is the left and
+ * top coordinates are always the origin and the right and bottom coordinates are always the
+ * specified width and height respectively. Drawing content is not clipped,
+ * so it is possible to draw outside of the specified bounds.
+ *
+ * @sample androidx.ui.graphics.samples.canvasScopeSample
+ */
+class CanvasScope {
+
+ @PublishedApi internal var canvas: Canvas? = null
+
+ /**
+ * Internal [Paint] used only for drawing filled in shapes with a color or gradient
+ * This is lazily allocated on the first drawing command that uses the [Fill] [DrawStyle]
+ * and re-used across subsequent calls
+ */
+ private val fillPaint: Paint by lazy(LazyThreadSafetyMode.NONE) {
+ Paint().apply { style = PaintingStyle.fill }
+ }
+
+ /**
+ * Internal [Paint] used only for drawing stroked shapes with a color or gradient
+ * This is lazily allocated on the first drawing command that uses the [Stroke] [DrawStyle]
+ * and re-used across subsequent calls
+ */
+ private val strokePaint: Paint by lazy(LazyThreadSafetyMode.NONE) {
+ Paint().apply { style = PaintingStyle.stroke }
+ }
+
+ /**
+ * Center of the current bounds of the drawing environment
+ */
+ val center: Offset
+ get() = Offset(size.width / 2, size.height / 2)
+
+ /**
+ * Provides the dimensions of the current drawing environment
+ */
+ var size: Size = Size.zero
+ private set
+
+ /**
+ * Draws a line between the given points using the given paint. The line is
+ * stroked.
+ *
+ * @param brush: the color or fill to be applied to the line
+ * @param p1: First point of the line to be drawn
+ * @param p2: Second point of the line to be drawn
+ * @param stroke: The stroke parameters to apply to the line
+ * @param alpha: opacity to be applied to the [brush] from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param colorFilter: ColorFilter to apply to the [brush] when drawn into the destination
+ * @param blendMode: the blending algorithm to apply to the [brush]
+ */
+ fun drawLine(
+ brush: Brush,
+ p1: Offset,
+ p2: Offset,
+ stroke: Stroke,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawLine(
+ p1,
+ p2,
+ configurePaint(brush, stroke, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws a line between the given points using the given paint. The line is
+ * stroked.
+ *
+ * @param color: the color to be applied to the line
+ * @param p1: First point of the line to be drawn
+ * @param p2: Second point of the line to be drawn
+ * @param stroke: The stroke parameters to apply to the line
+ * @param alpha: opacity to be applied to the [color] from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param colorFilter: ColorFilter to apply to the [color] when drawn into the destination
+ * @param blendMode: the blending algorithm to apply to the [color]
+ */
+ fun drawLine(
+ color: Color,
+ p1: Offset,
+ p2: Offset,
+ stroke: Stroke,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawLine(
+ p1,
+ p2,
+ configurePaint(color, stroke, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws a rectangle with the given offset and size. If no offset from the top left is provided,
+ * it is drawn starting from the origin of the current translation. If no size is provided,
+ * the size of the current environment is used.
+ *
+ * @param brush: The color or fill to be applied to the rectangle
+ * @param topLeft: Offset from the local origin of 0, 0 relative to the current translation
+ * @param size: Dimensions of the rectangle to draw
+ * @param alpha: Opacity to be applied to the [brush] from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the rectangle is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [brush] when drawn into the destination
+ * @param blendMode: Blending algorithm to apply to destination
+ */
+ fun drawRect(
+ brush: Brush,
+ topLeft: Offset = Offset.zero,
+ size: Size = this.size,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawRect(
+ left = topLeft.dx,
+ top = topLeft.dy,
+ right = topLeft.dx + size.width,
+ bottom = topLeft.dy + size.height,
+ paint = configurePaint(brush, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws a rectangle with the given offset and size. If no offset from the top left is provided,
+ * it is drawn starting from the origin of the current translation. If no size is provided,
+ * the size of the current environment is used.
+ *
+ * @param color: The color to be applied to the rectangle
+ * @param topLeft: Offset from the local origin of 0, 0 relative to the current translation
+ * @param size: Dimensions of the rectangle to draw
+ * @param alpha: Opacity to be applied to the [color] from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the rectangle is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [color] source pixels
+ * @param blendMode: Blending algorithm to apply to destination
+ */
+ fun drawRect(
+ color: Color,
+ topLeft: Offset = Offset.zero,
+ size: Size = this.size,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawRect(
+ left = topLeft.dx,
+ top = topLeft.dy,
+ right = topLeft.dx + size.width,
+ bottom = topLeft.dy + size.height,
+ paint = configurePaint(color, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws the given [ImageAsset] into the canvas with its top-left corner at the
+ * given [Offset]. The image is composited into the canvas using the given [Paint].
+ *
+ * @param image The [ImageAsset] to draw
+ * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
+ * @param alpha Opacity to be applied to [image] from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style Specifies whether the image is to be drawn filled in or as a rectangular stroke
+ * @param colorFilter: ColorFilter to apply to the [image] when drawn into the destination
+ * @param blendMode: Blending algorithm to apply to destination
+ */
+ fun drawImage(
+ image: ImageAsset,
+ topLeft: Offset = Offset.zero,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawImage(
+ image,
+ topLeft,
+ configurePaint(null, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws the subset of the given image described by the `src` argument into
+ * the canvas in the axis-aligned rectangle given by the `dst` argument.
+ *
+ * If no src rect is provided, the entire image is scaled into the corresponding destination
+ * bounds
+ *
+ * @param image: The source image to draw
+ * @param srcOffset: Optional offset representing the top left offset of the source image
+ * to draw, this defaults to the origin of [image]
+ * @param srcSize: Optional dimensions of the source image to draw relative to [srcOffset],
+ * this defaults the width and height of [image]
+ * @param dstOffset: Optional offset representing the top left offset of the destination
+ * to draw the given image, this defaults to the origin of the current translation
+ * tarting top left offset in the destination to draw the image
+ * @param dstSize: Optional dimensions of the destination to draw, this defaults to the size
+ * of the current drawing environment
+ * @param alpha Opacity to be applied to [image] from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style Specifies whether the image is to be drawn filled in or as a rectangular stroke
+ * @param colorFilter: ColorFilter to apply to the [image] when drawn into the destination
+ * @param blendMode: Blending algorithm to apply to destination
+ */
+ fun drawImage(
+ image: ImageAsset,
+ srcOffset: Offset = Offset.zero,
+ srcSize: Size = Size(image.width.toFloat(), image.height.toFloat()),
+ dstOffset: Offset = Offset.zero,
+ dstSize: Size = this.size,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawImageRect(
+ image,
+ srcOffset,
+ srcSize,
+ dstOffset,
+ dstSize,
+ configurePaint(null, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws a rounded rectangle with the provided size, offset and radii for the x and y axis
+ * respectively. This rectangle is drawn with the provided [Brush]
+ * parameter and is filled or stroked based on the given [DrawStyle]
+ *
+ * @param brush The color or fill to be applied to the rounded rectangle
+ * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
+ * @param size Dimensions of the rectangle to draw
+ * @param radiusX Corner radius of the rounded rectangle along the x-axis
+ * @param radiusY Corner radius of the rounded rectangle along the y-axis
+ * @param alpha Opacity to be applied to rounded rectangle from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style Specifies whether the rounded rectangle is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [brush] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the brush
+ */
+ fun drawRoundRect(
+ brush: Brush,
+ topLeft: Offset = Offset.zero,
+ size: Size = this.size,
+ radiusX: Float = 0.0f,
+ radiusY: Float = radiusX,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawRoundRect(
+ topLeft.dx,
+ topLeft.dy,
+ topLeft.dx + size.width,
+ topLeft.dy + size.height,
+ radiusX,
+ radiusY,
+ configurePaint(brush, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws a rounded rectangle with the given [Paint]. Whether the rectangle is
+ * filled or stroked (or both) is controlled by [Paint.style].
+ *
+ * @param color The color to be applied to the rounded rectangle
+ * @param topLeft Offset from the local origin of 0, 0 relative to the current translation
+ * @param size Dimensions of the rectangle to draw
+ * @param radiusX Corner radius of the rounded rectangle along the x-axis
+ * @param radiusY Corner radius of the rounded rectangle along the y-axis
+ * @param alpha Opacity to be applied to rounded rectangle from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style Specifies whether the rounded rectangle is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [color] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the color
+ */
+ fun drawRoundRect(
+ color: Color,
+ topLeft: Offset = Offset.zero,
+ size: Size = this.size,
+ radiusX: Float = 0.0f,
+ radiusY: Float = 0.0f,
+ style: DrawStyle = Fill,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawRoundRect(
+ topLeft.dx,
+ topLeft.dy,
+ topLeft.dx + size.width,
+ topLeft.dy + size.height,
+ radiusX,
+ radiusY,
+ configurePaint(color, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws a circle at the provided center coordinate and radius. If no center point is provided
+ * the center of the bounds is used.
+ *
+ * @param brush: The color or fill to be applied to the circle
+ * @param radius: The radius of the circle
+ * @param center: The center coordinate where the circle is to be drawn
+ * @param alpha: Opacity to be applied to the circle from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the circle is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [brush] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the brush
+ */
+ fun drawCircle(
+ brush: Brush,
+ radius: Float = size.minDimension / 2.0f,
+ center: Offset = this.center,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawCircle(
+ center,
+ radius,
+ configurePaint(brush, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws a circle at the provided center coordinate and radius. If no center point is provided
+ * the center of the bounds is used.
+ *
+ * @param color: The color or fill to be applied to the circle
+ * @param radius: The radius of the circle
+ * @param center: The center coordinate where the circle is to be drawn
+ * @param alpha: Opacity to be applied to the circle from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the circle is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [color] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the brush
+ */
+ fun drawCircle(
+ color: Color,
+ radius: Float = size.minDimension / 2.0f,
+ center: Offset = this.center,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawCircle(
+ center,
+ radius,
+ configurePaint(color, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws an oval with the given offset and size. If no offset from the top left is provided,
+ * it is drawn starting from the origin of the current translation. If no size is provided,
+ * the size of the current environment is used.
+ *
+ * @param brush: Color or fill to be applied to the oval
+ * @param topLeft: Offset from the local origin of 0, 0 relative to the current translation
+ * @param size: Dimensions of the rectangle to draw
+ * @param alpha: Opacity to be applied to the oval from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the oval is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [brush] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the brush
+ */
+ fun drawOval(
+ brush: Brush,
+ topLeft: Offset = Offset.zero,
+ size: Size = this.size,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawOval(
+ left = topLeft.dx,
+ top = topLeft.dy,
+ right = topLeft.dx + size.width,
+ bottom = topLeft.dy + size.height,
+ paint = configurePaint(brush, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws an oval with the given offset and size. If no offset from the top left is provided,
+ * it is drawn starting from the origin of the current translation. If no size is provided,
+ * the size of the current environment is used.
+ *
+ * @param color: Color to be applied to the oval
+ * @param topLeft: Offset from the local origin of 0, 0 relative to the current translation
+ * @param size: Dimensions of the rectangle to draw
+ * @param alpha: Opacity to be applied to the oval from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the oval is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [color] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the brush
+ */
+ fun drawOval(
+ color: Color,
+ topLeft: Offset = Offset.zero,
+ size: Size = this.size,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawOval(
+ left = topLeft.dx,
+ top = topLeft.dy,
+ right = topLeft.dx + size.width,
+ bottom = topLeft.dy + size.height,
+ paint = configurePaint(color, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draw an arc scaled to fit inside the given rectangle. It starts from
+ * startAngle degrees around the oval up to startAngle + sweepAngle
+ * degrees around the oval, with zero degrees being the point on
+ * the right hand side of the oval that crosses the horizontal line
+ * that intersects the center of the rectangle and with positive
+ * angles going clockwise around the oval. If useCenter is true, the arc is
+ * closed back to the center, forming a circle sector. Otherwise, the arc is
+ * not closed, forming a circle segment.
+ *
+ * @param brush: Color or fill to be applied to the arc
+ * @param topLeft: Offset from the local origin of 0, 0 relative to the current translation
+ * @param size: Dimensions of the arc to draw
+ * @param startAngle: Starting angle in degrees. 0 represents 3 o'clock
+ * @param sweepAngle: Size of the arc in degrees that is drawn at the position provided in
+ * [startAngle]
+ * @param useCenter: Flag indicating if the arc is to close the center of the bounds
+ * @param alpha: Opacity to be applied to the arc from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the arc is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [brush] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the arc when it is drawn
+ */
+ fun drawArc(
+ brush: Brush,
+ startAngle: Float,
+ sweepAngle: Float,
+ useCenter: Boolean,
+ topLeft: Offset = Offset.zero,
+ size: Size = this.size,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawArc(
+ left = topLeft.dx,
+ top = topLeft.dy,
+ right = topLeft.dx + size.width,
+ bottom = topLeft.dy + size.height,
+ startAngle = startAngle,
+ sweepAngle = sweepAngle,
+ useCenter = useCenter,
+ paint = configurePaint(brush, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draw an arc scaled to fit inside the given rectangle. It starts from
+ * startAngle degrees around the oval up to startAngle + sweepAngle
+ * degrees around the oval, with zero degrees being the point on
+ * the right hand side of the oval that crosses the horizontal line
+ * that intersects the center of the rectangle and with positive
+ * angles going clockwise around the oval. If useCenter is true, the arc is
+ * closed back to the center, forming a circle sector. Otherwise, the arc is
+ * not closed, forming a circle segment.
+ *
+ * @param color: Color to be applied to the arc
+ * @param topLeft: Offset from the local origin of 0, 0 relative to the current translation
+ * @param size: Dimensions of the arc to draw
+ * @param startAngle: Starting angle in degrees. 0 represents 3 o'clock
+ * @param sweepAngle: Size of the arc in degrees that is drawn at the position provided in
+ * [startAngle]
+ * @param useCenter: Flag indicating if the arc is to close the center of the bounds
+ * @param alpha: Opacity to be applied to the arc from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the arc is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [color] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the arc when it is drawn
+ */
+ fun drawArc(
+ color: Color,
+ startAngle: Float,
+ sweepAngle: Float,
+ useCenter: Boolean,
+ topLeft: Offset = Offset.zero,
+ size: Size = this.size,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawArc(
+ left = topLeft.dx,
+ top = topLeft.dy,
+ right = topLeft.dx + size.width,
+ bottom = topLeft.dy + size.height,
+ startAngle = startAngle,
+ sweepAngle = sweepAngle,
+ useCenter = useCenter,
+ paint = configurePaint(color, style, alpha, colorFilter, blendMode)
+ )
+
+ /**
+ * Draws the given [Path] with the given [Color]. Whether this shape is
+ * filled or stroked (or both) is controlled by [DrawStyle]. If the path is
+ * filled, then subpaths within it are implicitly closed (see [Path.close]).
+ *
+ *
+ * @param path: Path to draw
+ * @param color: Color to be applied to the path
+ * @param alpha: Opacity to be applied to the path from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the path is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [color] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the path when it is drawn
+ */
+ fun drawPath(
+ path: Path,
+ color: Color,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawPath(path, configurePaint(color, style, alpha, colorFilter, blendMode))
+
+ /**
+ * Draws the given [Path] with the given [Color]. Whether this shape is
+ * filled or stroked (or both) is controlled by [DrawStyle]. If the path is
+ * filled, then subpaths within it are implicitly closed (see [Path.close]).
+ *
+ * @param path: Path to draw
+ * @param brush: Brush to be applied to the path
+ * @param alpha: Opacity to be applied to the path from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the path is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [brush] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the path when it is drawn
+ */
+ fun drawPath(
+ path: Path,
+ brush: Brush,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawPath(path, configurePaint(brush, style, alpha, colorFilter, blendMode))
+
+ /**
+ * Draws a sequence of points according to the given [PointMode].
+ *
+ * The `points` argument is interpreted as offsets from the origin.
+ *
+ * @param points: List of points to draw with the specified [PointMode]
+ * @param pointMode: [PointMode] used to indicate how the points are to be drawn
+ * @param color: Color to be applied to the points
+ * @param alpha: Opacity to be applied to the path from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param stroke: The stroke parameters to apply to the points
+ * @param colorFilter: ColorFilter to apply to the [color] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the path when it is drawn
+ */
+ fun drawPoints(
+ points: List<Offset>,
+ pointMode: PointMode,
+ color: Color,
+ stroke: Stroke,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawPoints(
+ pointMode,
+ points,
+ configurePaint(color, stroke, alpha, colorFilter,
+ blendMode)
+ )
+
+ /**
+ * Draws a sequence of points according to the given [PointMode].
+ *
+ * The `points` argument is interpreted as offsets from the origin.
+ *
+ * @param points: List of points to draw with the specified [PointMode]
+ * @param pointMode: [PointMode] used to indicate how the points are to be drawn
+ * @param brush: Brush to be applied to the points
+ * @param alpha: Opacity to be applied to the path from 0.0f to 1.0f representing
+ * fully transparent to fully opaque respectively
+ * @param style: Whether or not the path is stroked or filled in
+ * @param colorFilter: ColorFilter to apply to the [brush] when drawn into the destination
+ * @param blendMode: Blending algorithm to be applied to the path when it is drawn
+ */
+ fun drawPoints(
+ points: List<Offset>,
+ pointMode: PointMode,
+ brush: Brush,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float = DefaultAlpha,
+ style: DrawStyle = Fill,
+ colorFilter: ColorFilter? = null,
+ blendMode: BlendMode = DefaultBlendMode
+ ) = canvas?.drawPoints(
+ pointMode,
+ points,
+ configurePaint(brush, style, alpha, colorFilter,
+ blendMode)
+ )
+
+ /**
+ * Draws into the provided [Canvas] with the commands specified in the lambda with this
+ * [CanvasScope] as a receiver
+ *
+ * @param canvas target canvas to render into
+ * @param size bounds relative to the current canvas translation in which the [CanvasScope]
+ * should draw within
+ * @param block lambda that is called to issue drawing commands on this [CanvasScope]
+ */
+ fun draw(canvas: Canvas, size: PxSize, block: CanvasScope.() -> Unit) {
+ val previousSize = this.size
+ // Remember the previous canvas in case we are temporarily re-directing our drawing
+ // to a separate Layer/RenderNode only to draw that content back into the original Canvas
+ // If there is no previous canvas that was being drawin into, this ends up reseting this
+ // parameter back to null defensively
+ val previousCanvas = this.canvas
+ this.canvas = canvas
+ setSize(Size(size.width.value, size.height.value))
+ canvas.save()
+ this.block()
+ canvas.restore()
+ setSize(previousSize)
+ this.canvas = previousCanvas
+ }
+
+ /**
+ * Configures the current size of the drawing environment, this is configured as part of
+ * the [draw] call
+ */
+ @PublishedApi
+ internal fun setSize(size: Size) {
+ this.size = size
+ }
+
+ /**
+ * Internal published APIs used to support inline scoped extension methods
+ * on CanvasScope directly, without exposing the underlying stateful APIs
+ * to conduct the transformations themselves as inline methods require
+ * all methods called within them to be public
+ */
+
+ /**
+ * Simultaneously translate the coordinate space by [left] and [top] as well as modify the
+ * width and height of the current painting area. This method reduces the width by Left +
+ * right as well as height by (top + bottom)
+ */
+ @PublishedApi
+ internal fun doInset(left: Float, top: Float, right: Float, bottom: Float) =
+ canvas?.let {
+ val updatedSize = size - Offset(left + right, top + bottom)
+ require(updatedSize.width > 0 && updatedSize.height > 0) {
+ "Width and height must be greater than zero"
+ }
+ setSize(updatedSize)
+ it.translate(left, top)
+ }
+
+ /**
+ * Selects the appropriate [Paint] object based on the style
+ * and applies the underlying [DrawStyle] parameters
+ */
+ private fun selectPaint(drawStyle: DrawStyle): Paint =
+ when (drawStyle) {
+ Fill -> fillPaint
+ is Stroke -> strokePaint.apply {
+ with(drawStyle) {
+ strokeWidth = width
+ strokeCap = cap
+ strokeMiterLimit = miter
+ strokeJoin = join
+
+ // TODO b/154550525 add PathEffect to Paint if necessary
+ asFrameworkPaint().pathEffect = pathEffect
+ }
+ }
+ }
+
+ /**
+ * Helper method to configure the corresponding [Brush] along with other properties
+ * on the corresponding paint specified by [DrawStyle]
+ */
+ private fun configurePaint(
+ brush: Brush?,
+ style: DrawStyle,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float,
+ colorFilter: ColorFilter?,
+ blendMode: BlendMode
+ ): Paint = selectPaint(style).apply {
+ brush?.applyTo(this)
+ if (this.alpha != alpha) this.alpha = alpha
+ if (this.colorFilter != colorFilter) this.colorFilter = colorFilter
+ if (this.blendMode != blendMode) this.blendMode = blendMode
+ }
+
+ /**
+ * Helper method to configure the corresponding [Color] along with other properties
+ * on the corresponding paint specified by [DrawStyle]
+ */
+ private fun configurePaint(
+ color: Color,
+ style: DrawStyle,
+ @FloatRange(from = 0.0, to = 1.0) alpha: Float,
+ colorFilter: ColorFilter?,
+ blendMode: BlendMode
+ ): Paint = selectPaint(style).apply {
+ // Modulate the color alpha directly
+ // instead of configuring a separate alpha parameter
+ val targetColor = color.modulate(alpha)
+ if (this.color != targetColor) this.color = targetColor
+ if (this.shader != null) this.shader = null
+ if (this.colorFilter != colorFilter) this.colorFilter = colorFilter
+ if (this.blendMode != blendMode) this.blendMode = blendMode
+ }
+
+ /**
+ * Returns a [Color] modulated with the given alpha value
+ */
+ private fun Color.modulate(alpha: Float): Color =
+ if (alpha != 1.0f) {
+ Color(
+ alpha = this.alpha * alpha,
+ red = this.red,
+ green = this.green,
+ blue = this.blue
+ )
+ } else {
+ this
+ }
+
+ companion object {
+ /**
+ * Default alpha value used for each drawing operation
+ * This represents a fully opaque drawing operation.
+ *
+ * Note color values that have their own alpha value
+ * will draw with some transparency even if this value
+ * is used
+ */
+ const val DefaultAlpha: Float = 1.0f
+
+ /**
+ * Default blending mode used for each drawing operation.
+ * This ensures that content is drawn on top of the pixels
+ * in the destination
+ */
+ val DefaultBlendMode: BlendMode = BlendMode.srcOver
+ }
+}
+
+/**
+ * Represents how the shapes should be drawn within a [CanvasScope]
+ */
+sealed class DrawStyle
+
+/**
+ * Default [DrawStyle] indicating shapes should be drawn completely filled in with the
+ * provided color or pattern
+ */
+object Fill : DrawStyle()
+
+/**
+ * [DrawStyle] that provides information for drawing content with a stroke
+ */
+data class Stroke(
+ /**
+ * Configure the width of the stroke in pixels
+ */
+ val width: Float = 0.0f,
+
+ /**
+ * Set the paint's stroke miter value. This is used to control the behavior of miter
+ * joins when the joins angle si sharp. This value must be >= 0.
+ */
+ val miter: Float = 4.0f,
+
+ /**
+ * Return the paint's Cap, controlling how the start and end of stroked
+ * lines and paths are treated. The default is [StrokeCap.butt]
+ */
+ val cap: StrokeCap = StrokeCap.butt,
+
+ /**
+ * Set's the treatment where lines and curve segments join on a stroked path.
+ * The default is [StrokeJoin.miter]
+ */
+ val join: StrokeJoin = StrokeJoin.miter,
+
+ /**
+ * Effect to apply to the stroke, null indicates a solid stroke line is to be drawn
+ */
+ val pathEffect: PathEffect? = null
+) : DrawStyle()
\ No newline at end of file
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ColorPainter.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ColorPainter.kt
index c3f9f30..ba0334c 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ColorPainter.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ColorPainter.kt
@@ -16,11 +16,8 @@
package androidx.ui.graphics.painter
-import androidx.ui.geometry.Rect
-import androidx.ui.graphics.Canvas
import androidx.ui.graphics.Color
import androidx.ui.graphics.ColorFilter
-import androidx.ui.graphics.Paint
import androidx.ui.unit.PxSize
import androidx.ui.unit.PxSize.Companion.UnspecifiedSize
@@ -28,28 +25,22 @@
* [Painter] implementation used to fill the provided bounds with the specified color
*/
data class ColorPainter(val color: Color) : Painter() {
- // TODO njawad replace with Brush + provide overloads for Color
- private val paint = Paint()
- init {
- paint.color = color
- }
+ private var alpha: Float = CanvasScope.DefaultAlpha
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
- // TODO njawad update with more shapes/ investigate merging/replacing DrawShape.kt
- canvas.drawRect(
- Rect.fromLTWH(0.0f, 0.0f, bounds.width.value, bounds.height.value),
- paint
- )
+ private var colorFilter: ColorFilter? = null
+
+ override fun CanvasScope.onDraw() {
+ drawRect(color = color, alpha = alpha, colorFilter = colorFilter)
}
override fun applyAlpha(alpha: Float): Boolean {
- paint.alpha = alpha
+ this.alpha = alpha
return true
}
override fun applyColorFilter(colorFilter: ColorFilter?): Boolean {
- paint.colorFilter = colorFilter
+ this.colorFilter = colorFilter
return true
}
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ImagePainter.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ImagePainter.kt
index a4bb45b..8c5e856 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ImagePainter.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ImagePainter.kt
@@ -16,58 +16,46 @@
package androidx.ui.graphics.painter
-import androidx.ui.geometry.Rect
-import androidx.ui.graphics.Canvas
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
import androidx.ui.graphics.ColorFilter
import androidx.ui.graphics.ImageAsset
-import androidx.ui.graphics.Paint
import androidx.ui.unit.IntPx
import androidx.ui.unit.PxSize
-import kotlin.math.roundToInt
-
-private val EmptyPaint = Paint()
/**
* [Painter] implementation used to draw an [ImageAsset] into the provided canvas
* This implementation can handle applying alpha and [ColorFilter] to it's drawn result
*
* @param image The [ImageAsset] to draw
- * @param srcBounds Optional rectangle used to draw a subsection of the [ImageAsset]. If null is
- * provided the entire [ImageAsset] is drawn within the bounds.
- * These bounds must have the following requirements:
+ * @param srcOffset Optional offset relative to [image] used to draw a subsection of the
+ * [ImageAsset]. By default this uses the origin of [image]
+ * @param srcSize Optional dimensions representing size of the subsection of [image] to draw
+ * Both the offset and size must have the following requirements:
*
* 1) Left and top bounds must be greater than or equal to zero
- * 2) Right and bottom bounds must be greater than the left and top respectively
- * 3) Width and height of the bounds must be less than or equal to the dimensions of [image]
+ * 2) Source size must be greater than zero
+ * 3) Source size must be less than or equal to the dimensions of [image]
*/
-data class ImagePainter(private val image: ImageAsset, val srcBounds: Rect? = null) : Painter() {
+data class ImagePainter(
+ private val image: ImageAsset,
+ private val srcOffset: Offset = Offset.zero,
+ private val srcSize: Size = Size(image.width.toFloat(), image.height.toFloat())
+) : Painter() {
- private val size: PxSize = if (srcBounds != null) {
- require(
- srcBounds.left >= 0 &&
- srcBounds.top >= 0 &&
- srcBounds.right <= image.width &&
- srcBounds.bottom <= image.height &&
- srcBounds.right > srcBounds.left &&
- srcBounds.bottom > srcBounds.top
- )
- PxSize(IntPx(srcBounds.width.roundToInt()), IntPx(srcBounds.height.roundToInt()))
- } else {
- PxSize(IntPx(image.width), IntPx(image.height))
- }
+ private val size: PxSize = validateSize(srcOffset, srcSize)
- /**
- * Lazily allocated paint used to draw the [ImageAsset] if an alpha value between 0.0f and 1.0f
- * is provided or a color filter is defined on the [Painter]
- */
- private var paint: Paint? = null
+ private var alpha: Float = CanvasScope.DefaultAlpha
- override fun onDraw(canvas: Canvas, bounds: PxSize) {
- canvas.drawImageRect(
+ private var colorFilter: ColorFilter? = null
+
+ override fun CanvasScope.onDraw() {
+ drawImage(
image,
- srcBounds,
- Rect.fromLTWH(0.0f, 0.0f, bounds.width.value, bounds.height.value),
- paint ?: EmptyPaint
+ srcOffset,
+ srcSize,
+ alpha = alpha,
+ colorFilter = colorFilter
)
}
@@ -77,21 +65,24 @@
override val intrinsicSize: PxSize get() = size
override fun applyAlpha(alpha: Float): Boolean {
- obtainPaint().alpha = alpha
+ this.alpha = alpha
return true
}
override fun applyColorFilter(colorFilter: ColorFilter?): Boolean {
- obtainPaint().colorFilter = colorFilter
+ this.colorFilter = colorFilter
return true
}
- private fun obtainPaint(): Paint {
- var target = paint
- if (target == null) {
- target = Paint()
- paint = target
- }
- return target
+ private fun validateSize(srcOffset: Offset, srcSize: Size): PxSize {
+ require(
+ srcOffset.dx >= 0 &&
+ srcOffset.dy >= 0 &&
+ srcSize.width >= 0 &&
+ srcSize.height >= 0 &&
+ srcSize.width <= image.width &&
+ srcSize.height <= image.height
+ )
+ return PxSize(IntPx(srcSize.width.toInt()), IntPx(srcSize.height.toInt()))
}
}
\ No newline at end of file
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/Painter.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/Painter.kt
index 650862e..1513854 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/Painter.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/Painter.kt
@@ -69,6 +69,8 @@
*/
private var colorFilter: ColorFilter? = null
+ private val canvasScope = CanvasScope()
+
/**
* Optional [ColorFilter] used to modify the source pixels when drawn to the destination
* The default implementation of [Painter] will render it's contents into a separate
@@ -142,6 +144,8 @@
}
}
+ private val drawLambda: CanvasScope.() -> Unit = { onDraw() }
+
/**
* Return the intrinsic size of the [Painter].
* If the there is no intrinsic size (i.e. filling bounds with an arbitrary color) return
@@ -157,7 +161,7 @@
* Implementation of drawing logic for instances of [Painter]. This is invoked
* internally within [draw] after the positioning and configuring the [Painter]
*/
- protected abstract fun onDraw(canvas: Canvas, bounds: PxSize)
+ protected abstract fun CanvasScope.onDraw()
/**
* Apply the provided alpha value returning true if it was applied successfully,
@@ -179,7 +183,7 @@
fun draw(
canvas: Canvas,
- bounds: PxSize,
+ size: PxSize,
alpha: Float = DefaultAlpha,
colorFilter: ColorFilter? = null,
rtl: Boolean = false
@@ -191,13 +195,13 @@
if (alpha > 0.0f) {
if (useLayer) {
val layerRect =
- Rect.fromLTWH(0.0f, 0.0f, bounds.width.value, bounds.height.value)
- // TODO njawad replace with RenderNode/Layer API usage
+ Rect.fromLTWH(0.0f, 0.0f, size.width.value, size.height.value)
+ // TODO (b/154550724) njawad replace with RenderNode/Layer API usage
canvas.withSaveLayer(layerRect, obtainPaint()) {
- onDraw(canvas, bounds)
+ canvasScope.draw(canvas, size, drawLambda)
}
} else {
- onDraw(canvas, bounds)
+ canvasScope.draw(canvas, size, drawLambda)
}
}
}
diff --git a/ui/ui-layout/api/0.1.0-dev11.txt b/ui/ui-layout/api/0.1.0-dev11.txt
index 4f1aa5c..242d47f 100644
--- a/ui/ui-layout/api/0.1.0-dev11.txt
+++ b/ui/ui-layout/api/0.1.0-dev11.txt
@@ -267,10 +267,6 @@
property public final androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor.ConstrainedLayoutAnchor top;
}
- public final class ContainerKt {
- method @Deprecated public static void Container-ABW1B3s(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.InnerPadding padding = androidx.ui.layout.InnerPadding(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
public final class CrossAxisAlignment {
field public static final androidx.ui.layout.CrossAxisAlignment.Companion! Companion;
}
@@ -453,87 +449,5 @@
method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
}
- @androidx.ui.layout.LayoutScopeMarker public final class TableChildren {
- method public void tableDecoration(boolean overlay, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableDecorationChildren,kotlin.Unit> decoration);
- method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
- public abstract class TableColumnWidth {
- method public int maxIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public int minIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public abstract int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fixed extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public androidx.ui.layout.TableColumnWidth.Fixed copy-ipo6vVg(float width);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Flex extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Flex(@FloatRange(from=null) float flex);
- method public androidx.ui.layout.TableColumnWidth.Flex copy(float flex);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fraction extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Fraction(@FloatRange(from=null, to=null) float fraction);
- method public androidx.ui.layout.TableColumnWidth.Fraction copy(float fraction);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public abstract static class TableColumnWidth.Inflexible extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Inflexible();
- method public final androidx.ui.layout.TableColumnWidth flexible(float flex);
- }
-
- public static final class TableColumnWidth.Max extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Max(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Max copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MaxIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MaxIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Min extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Min(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Min copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MinIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MinIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Wrap extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.Wrap! INSTANCE;
- }
-
- public final class TableDecorationChildren {
- method public java.util.List<androidx.ui.unit.IntPx> component1();
- method public java.util.List<androidx.ui.unit.IntPx> component2();
- method public androidx.ui.layout.TableDecorationChildren copy(java.util.List<androidx.ui.unit.IntPx> verticalOffsets, java.util.List<androidx.ui.unit.IntPx> horizontalOffsets);
- method public java.util.List<androidx.ui.unit.IntPx> getHorizontalOffsets();
- method public java.util.List<androidx.ui.unit.IntPx> getVerticalOffsets();
- }
-
- public final class TableKt {
- method public static void Table(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,androidx.ui.core.Alignment> alignment = { return Alignment.TopStart }, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.layout.TableColumnWidth> columnWidth = { return TableColumnWidth.<init>(1.0) }, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> children);
- }
-
- public final class TableMeasurable {
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> component1();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component2();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component3();
- method public androidx.ui.layout.TableMeasurable copy(kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> preferredWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> minIntrinsicWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> maxIntrinsicWidth);
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMaxIntrinsicWidth();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMinIntrinsicWidth();
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> getPreferredWidth();
- }
-
}
diff --git a/ui/ui-layout/api/current.txt b/ui/ui-layout/api/current.txt
index 4f1aa5c..242d47f 100644
--- a/ui/ui-layout/api/current.txt
+++ b/ui/ui-layout/api/current.txt
@@ -267,10 +267,6 @@
property public final androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor.ConstrainedLayoutAnchor top;
}
- public final class ContainerKt {
- method @Deprecated public static void Container-ABW1B3s(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.InnerPadding padding = androidx.ui.layout.InnerPadding(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
public final class CrossAxisAlignment {
field public static final androidx.ui.layout.CrossAxisAlignment.Companion! Companion;
}
@@ -453,87 +449,5 @@
method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
}
- @androidx.ui.layout.LayoutScopeMarker public final class TableChildren {
- method public void tableDecoration(boolean overlay, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableDecorationChildren,kotlin.Unit> decoration);
- method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
- public abstract class TableColumnWidth {
- method public int maxIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public int minIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public abstract int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fixed extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public androidx.ui.layout.TableColumnWidth.Fixed copy-ipo6vVg(float width);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Flex extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Flex(@FloatRange(from=null) float flex);
- method public androidx.ui.layout.TableColumnWidth.Flex copy(float flex);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fraction extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Fraction(@FloatRange(from=null, to=null) float fraction);
- method public androidx.ui.layout.TableColumnWidth.Fraction copy(float fraction);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public abstract static class TableColumnWidth.Inflexible extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Inflexible();
- method public final androidx.ui.layout.TableColumnWidth flexible(float flex);
- }
-
- public static final class TableColumnWidth.Max extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Max(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Max copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MaxIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MaxIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Min extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Min(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Min copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MinIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MinIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Wrap extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.Wrap! INSTANCE;
- }
-
- public final class TableDecorationChildren {
- method public java.util.List<androidx.ui.unit.IntPx> component1();
- method public java.util.List<androidx.ui.unit.IntPx> component2();
- method public androidx.ui.layout.TableDecorationChildren copy(java.util.List<androidx.ui.unit.IntPx> verticalOffsets, java.util.List<androidx.ui.unit.IntPx> horizontalOffsets);
- method public java.util.List<androidx.ui.unit.IntPx> getHorizontalOffsets();
- method public java.util.List<androidx.ui.unit.IntPx> getVerticalOffsets();
- }
-
- public final class TableKt {
- method public static void Table(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,androidx.ui.core.Alignment> alignment = { return Alignment.TopStart }, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.layout.TableColumnWidth> columnWidth = { return TableColumnWidth.<init>(1.0) }, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> children);
- }
-
- public final class TableMeasurable {
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> component1();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component2();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component3();
- method public androidx.ui.layout.TableMeasurable copy(kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> preferredWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> minIntrinsicWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> maxIntrinsicWidth);
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMaxIntrinsicWidth();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMinIntrinsicWidth();
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> getPreferredWidth();
- }
-
}
diff --git a/ui/ui-layout/api/public_plus_experimental_0.1.0-dev11.txt b/ui/ui-layout/api/public_plus_experimental_0.1.0-dev11.txt
index 4f1aa5c..242d47f 100644
--- a/ui/ui-layout/api/public_plus_experimental_0.1.0-dev11.txt
+++ b/ui/ui-layout/api/public_plus_experimental_0.1.0-dev11.txt
@@ -267,10 +267,6 @@
property public final androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor.ConstrainedLayoutAnchor top;
}
- public final class ContainerKt {
- method @Deprecated public static void Container-ABW1B3s(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.InnerPadding padding = androidx.ui.layout.InnerPadding(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
public final class CrossAxisAlignment {
field public static final androidx.ui.layout.CrossAxisAlignment.Companion! Companion;
}
@@ -453,87 +449,5 @@
method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
}
- @androidx.ui.layout.LayoutScopeMarker public final class TableChildren {
- method public void tableDecoration(boolean overlay, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableDecorationChildren,kotlin.Unit> decoration);
- method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
- public abstract class TableColumnWidth {
- method public int maxIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public int minIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public abstract int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fixed extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public androidx.ui.layout.TableColumnWidth.Fixed copy-ipo6vVg(float width);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Flex extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Flex(@FloatRange(from=null) float flex);
- method public androidx.ui.layout.TableColumnWidth.Flex copy(float flex);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fraction extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Fraction(@FloatRange(from=null, to=null) float fraction);
- method public androidx.ui.layout.TableColumnWidth.Fraction copy(float fraction);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public abstract static class TableColumnWidth.Inflexible extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Inflexible();
- method public final androidx.ui.layout.TableColumnWidth flexible(float flex);
- }
-
- public static final class TableColumnWidth.Max extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Max(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Max copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MaxIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MaxIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Min extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Min(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Min copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MinIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MinIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Wrap extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.Wrap! INSTANCE;
- }
-
- public final class TableDecorationChildren {
- method public java.util.List<androidx.ui.unit.IntPx> component1();
- method public java.util.List<androidx.ui.unit.IntPx> component2();
- method public androidx.ui.layout.TableDecorationChildren copy(java.util.List<androidx.ui.unit.IntPx> verticalOffsets, java.util.List<androidx.ui.unit.IntPx> horizontalOffsets);
- method public java.util.List<androidx.ui.unit.IntPx> getHorizontalOffsets();
- method public java.util.List<androidx.ui.unit.IntPx> getVerticalOffsets();
- }
-
- public final class TableKt {
- method public static void Table(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,androidx.ui.core.Alignment> alignment = { return Alignment.TopStart }, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.layout.TableColumnWidth> columnWidth = { return TableColumnWidth.<init>(1.0) }, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> children);
- }
-
- public final class TableMeasurable {
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> component1();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component2();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component3();
- method public androidx.ui.layout.TableMeasurable copy(kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> preferredWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> minIntrinsicWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> maxIntrinsicWidth);
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMaxIntrinsicWidth();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMinIntrinsicWidth();
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> getPreferredWidth();
- }
-
}
diff --git a/ui/ui-layout/api/public_plus_experimental_current.txt b/ui/ui-layout/api/public_plus_experimental_current.txt
index 4f1aa5c..242d47f 100644
--- a/ui/ui-layout/api/public_plus_experimental_current.txt
+++ b/ui/ui-layout/api/public_plus_experimental_current.txt
@@ -267,10 +267,6 @@
property public final androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor.ConstrainedLayoutAnchor top;
}
- public final class ContainerKt {
- method @Deprecated public static void Container-ABW1B3s(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.InnerPadding padding = androidx.ui.layout.InnerPadding(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
public final class CrossAxisAlignment {
field public static final androidx.ui.layout.CrossAxisAlignment.Companion! Companion;
}
@@ -453,87 +449,5 @@
method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
}
- @androidx.ui.layout.LayoutScopeMarker public final class TableChildren {
- method public void tableDecoration(boolean overlay, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableDecorationChildren,kotlin.Unit> decoration);
- method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
- public abstract class TableColumnWidth {
- method public int maxIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public int minIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public abstract int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fixed extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public androidx.ui.layout.TableColumnWidth.Fixed copy-ipo6vVg(float width);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Flex extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Flex(@FloatRange(from=null) float flex);
- method public androidx.ui.layout.TableColumnWidth.Flex copy(float flex);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fraction extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Fraction(@FloatRange(from=null, to=null) float fraction);
- method public androidx.ui.layout.TableColumnWidth.Fraction copy(float fraction);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public abstract static class TableColumnWidth.Inflexible extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Inflexible();
- method public final androidx.ui.layout.TableColumnWidth flexible(float flex);
- }
-
- public static final class TableColumnWidth.Max extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Max(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Max copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MaxIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MaxIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Min extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Min(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Min copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MinIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MinIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Wrap extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.Wrap! INSTANCE;
- }
-
- public final class TableDecorationChildren {
- method public java.util.List<androidx.ui.unit.IntPx> component1();
- method public java.util.List<androidx.ui.unit.IntPx> component2();
- method public androidx.ui.layout.TableDecorationChildren copy(java.util.List<androidx.ui.unit.IntPx> verticalOffsets, java.util.List<androidx.ui.unit.IntPx> horizontalOffsets);
- method public java.util.List<androidx.ui.unit.IntPx> getHorizontalOffsets();
- method public java.util.List<androidx.ui.unit.IntPx> getVerticalOffsets();
- }
-
- public final class TableKt {
- method public static void Table(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,androidx.ui.core.Alignment> alignment = { return Alignment.TopStart }, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.layout.TableColumnWidth> columnWidth = { return TableColumnWidth.<init>(1.0) }, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> children);
- }
-
- public final class TableMeasurable {
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> component1();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component2();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component3();
- method public androidx.ui.layout.TableMeasurable copy(kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> preferredWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> minIntrinsicWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> maxIntrinsicWidth);
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMaxIntrinsicWidth();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMinIntrinsicWidth();
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> getPreferredWidth();
- }
-
}
diff --git a/ui/ui-layout/api/restricted_0.1.0-dev11.txt b/ui/ui-layout/api/restricted_0.1.0-dev11.txt
index 4f1aa5c..242d47f 100644
--- a/ui/ui-layout/api/restricted_0.1.0-dev11.txt
+++ b/ui/ui-layout/api/restricted_0.1.0-dev11.txt
@@ -267,10 +267,6 @@
property public final androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor.ConstrainedLayoutAnchor top;
}
- public final class ContainerKt {
- method @Deprecated public static void Container-ABW1B3s(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.InnerPadding padding = androidx.ui.layout.InnerPadding(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
public final class CrossAxisAlignment {
field public static final androidx.ui.layout.CrossAxisAlignment.Companion! Companion;
}
@@ -453,87 +449,5 @@
method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
}
- @androidx.ui.layout.LayoutScopeMarker public final class TableChildren {
- method public void tableDecoration(boolean overlay, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableDecorationChildren,kotlin.Unit> decoration);
- method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
- public abstract class TableColumnWidth {
- method public int maxIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public int minIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public abstract int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fixed extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public androidx.ui.layout.TableColumnWidth.Fixed copy-ipo6vVg(float width);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Flex extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Flex(@FloatRange(from=null) float flex);
- method public androidx.ui.layout.TableColumnWidth.Flex copy(float flex);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fraction extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Fraction(@FloatRange(from=null, to=null) float fraction);
- method public androidx.ui.layout.TableColumnWidth.Fraction copy(float fraction);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public abstract static class TableColumnWidth.Inflexible extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Inflexible();
- method public final androidx.ui.layout.TableColumnWidth flexible(float flex);
- }
-
- public static final class TableColumnWidth.Max extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Max(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Max copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MaxIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MaxIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Min extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Min(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Min copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MinIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MinIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Wrap extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.Wrap! INSTANCE;
- }
-
- public final class TableDecorationChildren {
- method public java.util.List<androidx.ui.unit.IntPx> component1();
- method public java.util.List<androidx.ui.unit.IntPx> component2();
- method public androidx.ui.layout.TableDecorationChildren copy(java.util.List<androidx.ui.unit.IntPx> verticalOffsets, java.util.List<androidx.ui.unit.IntPx> horizontalOffsets);
- method public java.util.List<androidx.ui.unit.IntPx> getHorizontalOffsets();
- method public java.util.List<androidx.ui.unit.IntPx> getVerticalOffsets();
- }
-
- public final class TableKt {
- method public static void Table(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,androidx.ui.core.Alignment> alignment = { return Alignment.TopStart }, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.layout.TableColumnWidth> columnWidth = { return TableColumnWidth.<init>(1.0) }, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> children);
- }
-
- public final class TableMeasurable {
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> component1();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component2();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component3();
- method public androidx.ui.layout.TableMeasurable copy(kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> preferredWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> minIntrinsicWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> maxIntrinsicWidth);
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMaxIntrinsicWidth();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMinIntrinsicWidth();
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> getPreferredWidth();
- }
-
}
diff --git a/ui/ui-layout/api/restricted_current.txt b/ui/ui-layout/api/restricted_current.txt
index 4f1aa5c..242d47f 100644
--- a/ui/ui-layout/api/restricted_current.txt
+++ b/ui/ui-layout/api/restricted_current.txt
@@ -267,10 +267,6 @@
property public final androidx.ui.layout.ConstraintSetBuilderScope.HorizontalAnchor.ConstrainedLayoutAnchor top;
}
- public final class ContainerKt {
- method @Deprecated public static void Container-ABW1B3s(androidx.ui.core.Modifier modifier = Modifier, androidx.ui.layout.InnerPadding padding = androidx.ui.layout.InnerPadding(0.dp), androidx.ui.core.Alignment alignment = Alignment.Center, boolean expanded = false, androidx.ui.layout.DpConstraints constraints = androidx.ui.layout.DpConstraints(), androidx.ui.unit.Dp? width = null, androidx.ui.unit.Dp? height = null, kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
public final class CrossAxisAlignment {
field public static final androidx.ui.layout.CrossAxisAlignment.Companion! Companion;
}
@@ -453,87 +449,5 @@
method public androidx.ui.core.Modifier matchParentSize(androidx.ui.core.Modifier);
}
- @androidx.ui.layout.LayoutScopeMarker public final class TableChildren {
- method public void tableDecoration(boolean overlay, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableDecorationChildren,kotlin.Unit> decoration);
- method public void tableRow(kotlin.jvm.functions.Function0<kotlin.Unit> children);
- }
-
- public abstract class TableColumnWidth {
- method public int maxIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public int minIntrinsicWidth-17UHc7E(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density, int availableHeight);
- method public abstract int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fixed extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public androidx.ui.layout.TableColumnWidth.Fixed copy-ipo6vVg(float width);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Flex extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Flex(@FloatRange(from=null) float flex);
- method public androidx.ui.layout.TableColumnWidth.Flex copy(float flex);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.Fraction extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Fraction(@FloatRange(from=null, to=null) float fraction);
- method public androidx.ui.layout.TableColumnWidth.Fraction copy(float fraction);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public abstract static class TableColumnWidth.Inflexible extends androidx.ui.layout.TableColumnWidth {
- ctor public TableColumnWidth.Inflexible();
- method public final androidx.ui.layout.TableColumnWidth flexible(float flex);
- }
-
- public static final class TableColumnWidth.Max extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Max(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Max copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MaxIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MaxIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Min extends androidx.ui.layout.TableColumnWidth.Inflexible {
- ctor public TableColumnWidth.Min(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public androidx.ui.layout.TableColumnWidth.Min copy(androidx.ui.layout.TableColumnWidth.Inflexible a, androidx.ui.layout.TableColumnWidth.Inflexible b);
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- }
-
- public static final class TableColumnWidth.MinIntrinsic extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.MinIntrinsic! INSTANCE;
- }
-
- public static final class TableColumnWidth.Wrap extends androidx.ui.layout.TableColumnWidth.Inflexible {
- method public int preferredWidth-IoUeifE(java.util.List<androidx.ui.layout.TableMeasurable> cells, int containerWidth, androidx.ui.unit.Density density);
- field public static final androidx.ui.layout.TableColumnWidth.Wrap! INSTANCE;
- }
-
- public final class TableDecorationChildren {
- method public java.util.List<androidx.ui.unit.IntPx> component1();
- method public java.util.List<androidx.ui.unit.IntPx> component2();
- method public androidx.ui.layout.TableDecorationChildren copy(java.util.List<androidx.ui.unit.IntPx> verticalOffsets, java.util.List<androidx.ui.unit.IntPx> horizontalOffsets);
- method public java.util.List<androidx.ui.unit.IntPx> getHorizontalOffsets();
- method public java.util.List<androidx.ui.unit.IntPx> getVerticalOffsets();
- }
-
- public final class TableKt {
- method public static void Table(int columns, kotlin.jvm.functions.Function1<? super java.lang.Integer,androidx.ui.core.Alignment> alignment = { return Alignment.TopStart }, kotlin.jvm.functions.Function1<? super java.lang.Integer,? extends androidx.ui.layout.TableColumnWidth> columnWidth = { return TableColumnWidth.<init>(1.0) }, kotlin.jvm.functions.Function1<? super androidx.ui.layout.TableChildren,kotlin.Unit> children);
- }
-
- public final class TableMeasurable {
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> component1();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component2();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> component3();
- method public androidx.ui.layout.TableMeasurable copy(kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> preferredWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> minIntrinsicWidth, kotlin.jvm.functions.Function1<? super androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> maxIntrinsicWidth);
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMaxIntrinsicWidth();
- method public kotlin.jvm.functions.Function1<androidx.ui.unit.IntPx,androidx.ui.unit.IntPx> getMinIntrinsicWidth();
- method public kotlin.jvm.functions.Function0<androidx.ui.unit.IntPx> getPreferredWidth();
- }
-
}
diff --git a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutDemos.kt b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutDemos.kt
index c0ee5f2..420f585 100644
--- a/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutDemos.kt
+++ b/ui/ui-layout/integration-tests/layout-demos/src/main/java/androidx/ui/layout/demos/LayoutDemos.kt
@@ -19,13 +19,11 @@
import androidx.ui.demos.common.ComposableDemo
import androidx.ui.demos.common.DemoCategory
import androidx.ui.layout.samples.SimpleFlowRow
-import androidx.ui.layout.samples.TableWithDecorations
val LayoutDemos = DemoCategory("Layout", listOf(
ComposableDemo("Complex layout") { ComplexLayoutDemo() },
ComposableDemo("ConstraintLayout") { ConstraintLayoutDemo() },
ComposableDemo("Flow layout") { SimpleFlowRow() },
ComposableDemo("Row and column") { SimpleLayoutDemo() },
- ComposableDemo("Rtl support") { RtlDemo() },
- ComposableDemo("Table layout") { TableWithDecorations() }
+ ComposableDemo("Rtl support") { RtlDemo() }
))
diff --git a/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/TableSample.kt b/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/TableSample.kt
deleted file mode 100644
index 15af1ee..0000000
--- a/ui/ui-layout/samples/src/main/java/androidx/ui/layout/samples/TableSample.kt
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2019 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.ui.layout.samples
-
-import androidx.annotation.Sampled
-import androidx.compose.Composable
-import androidx.ui.core.Modifier
-import androidx.ui.foundation.Box
-import androidx.ui.foundation.shape.corner.CircleShape
-import androidx.ui.graphics.Color
-import androidx.ui.layout.Table
-import androidx.ui.layout.TableColumnWidth
-import androidx.ui.layout.aspectRatio
-import androidx.ui.layout.padding
-import androidx.ui.layout.preferredHeight
-import androidx.ui.layout.preferredSize
-import androidx.ui.unit.dp
-
-@Sampled
-@Composable
-fun SimpleTable() {
- Table(columns = 8) {
- for (i in 0 until 8) {
- tableRow {
- for (j in 0 until 8) {
- Box(
- Modifier.padding(2.dp).aspectRatio(1f),
- backgroundColor = Color.Magenta
- )
- }
- }
- }
- }
-}
-
-@Sampled
-@Composable
-fun TableWithDecorations() {
- Table(columns = 8) {
- tableDecoration(overlay = false) {
- Box(backgroundColor = Color.Green)
- }
- tableDecoration(overlay = false) {
- Box(shape = CircleShape, backgroundColor = Color.Red)
- }
- for (i in 0 until 8) {
- tableRow {
- for (j in 0 until 8) {
- Box(
- Modifier.padding(2.dp).aspectRatio(1f),
- backgroundColor = Color.Magenta
- )
- }
- }
- }
- }
-}
-
-@Sampled
-@Composable
-fun TableWithDifferentColumnWidths() {
- val padding = Modifier.padding(2.dp)
- Table(
- columns = 5,
- columnWidth = { columnIndex ->
- when (columnIndex) {
- 0 -> TableColumnWidth.Wrap
- 1 -> TableColumnWidth.Flex(flex = 1f)
- 2 -> TableColumnWidth.Flex(flex = 3f)
- 3 -> TableColumnWidth.Fixed(width = 50.dp)
- else -> TableColumnWidth.Fraction(fraction = 0.5f)
- }
- }
- ) {
- for (i in 0 until 8) {
- tableRow {
- Box(padding.preferredSize(25.dp, 25.dp), backgroundColor = Color.Magenta)
- for (j in 1 until 5) {
- Box(padding.preferredHeight(25.dp), backgroundColor = Color.Magenta)
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/TableTest.kt b/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/TableTest.kt
deleted file mode 100644
index ae32cec..0000000
--- a/ui/ui-layout/src/androidTest/java/androidx/ui/layout/test/TableTest.kt
+++ /dev/null
@@ -1,1626 +0,0 @@
-/*
- * Copyright 2019 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.ui.layout.test
-
-import androidx.compose.Composable
-import androidx.test.filters.SmallTest
-import androidx.ui.core.LayoutCoordinates
-import androidx.ui.core.Modifier
-import androidx.ui.core.Ref
-import androidx.ui.core.onChildPositioned
-import androidx.ui.layout.DpConstraints
-import androidx.ui.layout.Stack
-import androidx.ui.layout.Table
-import androidx.ui.layout.TableColumnWidth
-import androidx.ui.layout.TableMeasurable
-import androidx.ui.layout.aspectRatio
-import androidx.ui.unit.Density
-import androidx.ui.unit.IntPx
-import androidx.ui.unit.IntPxSize
-import androidx.ui.unit.PxPosition
-import androidx.ui.unit.ipx
-import androidx.ui.unit.max
-import androidx.ui.unit.min
-import org.junit.Assert.assertEquals
-import org.junit.Assert.assertTrue
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import java.util.concurrent.CountDownLatch
-import java.util.concurrent.TimeUnit
-import kotlin.math.max
-import kotlin.math.pow
-
-@SmallTest
-@RunWith(JUnit4::class)
-class TableTest : LayoutTest() {
- @Test
- fun testTable() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val tableWidth = 256.ipx
- val tableWidthDp = tableWidth.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack {
- ConstrainedBox(constraints = DpConstraints(maxWidth = tableWidthDp),
- modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(
- height = sizeDp, expanded = true,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(tableWidth, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(tableWidth / columns, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(tableWidth * j / columns, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_flex() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val tableWidth = 256.ipx
- val tableWidthDp = tableWidth.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- val flexes = Array(columns) { j -> 2f.pow(max(j - 1, 0)) }
- val totalFlex = flexes.sum()
-
- show {
- Stack {
- ConstrainedBox(constraints = DpConstraints(maxWidth = tableWidthDp),
- modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = { j ->
- TableColumnWidth.Flex(flex = flexes[j])
- }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(height = sizeDp, expanded = true,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(tableWidth, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(tableWidth * flexes[j] / totalFlex, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(tableWidth * flexes.take(j).sum() / totalFlex, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_wrap() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack(modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = { TableColumnWidth.Wrap }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(width = sizeDp, height = sizeDp,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(size * columns, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(size, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(size * j, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_wrap_flexible() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 32.ipx
- val sizeDp = size.toDp()
- val tableWidth = 256.ipx
- val tableWidthDp = tableWidth.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- val flexes = Array(columns) { j -> 2f.pow(max(j - 1, 0)) }
- val totalFlex = flexes.sum()
-
- show {
- Stack {
- ConstrainedBox(constraints = DpConstraints(maxWidth = tableWidthDp),
- modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = { j ->
- TableColumnWidth.Wrap.flexible(flex = flexes[j])
- }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(width = sizeDp, height = sizeDp,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- val availableSpace = (tableWidth - size * columns).coerceAtLeast(IntPx.Zero)
-
- assertEquals(
- IntPxSize(size * columns, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(size, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(
- size * j + availableSpace * flexes.take(j).sum() / totalFlex,
- size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_minIntrinsic() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack(modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(
- columns = columns,
- columnWidth = { TableColumnWidth.MinIntrinsic }
- ) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(width = sizeDp, height = sizeDp,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(size * columns, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(size, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(size * j, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_maxIntrinsic() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack(modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(
- columns = columns,
- columnWidth = { TableColumnWidth.MaxIntrinsic }
- ) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(width = sizeDp, height = sizeDp,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(size * columns, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(size, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(size * j, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_fixed() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack(modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(
- columns = columns,
- columnWidth = { TableColumnWidth.Fixed(width = sizeDp) }
- ) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(height = sizeDp, expanded = true,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(size * columns, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(size, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(size * j, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_fraction() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val tableWidth = 256.ipx
- val tableWidthDp = tableWidth.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- val fractions = Array(columns) { j -> 1 / 2f.pow(j + 1) }
-
- show {
- Stack {
- ConstrainedBox(constraints = DpConstraints(maxWidth = tableWidthDp),
- modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = { j ->
- TableColumnWidth.Fraction(fraction = fractions[j])
- }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(height = sizeDp, expanded = true,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(tableWidth * fractions.sum(), size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(tableWidth * fractions[j], size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(tableWidth * fractions.take(j).sum(), size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_min() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val minWidth = 24.ipx
- val minWidthDp = minWidth.toDp()
- val tableWidth = 256.ipx
- val tableWidthDp = tableWidth.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack {
- ConstrainedBox(constraints = DpConstraints(maxWidth = tableWidthDp),
- modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = { j ->
- TableColumnWidth.Min(
- a = TableColumnWidth.Fixed(width = minWidthDp),
- b = TableColumnWidth.Fraction(
- fraction = if (j % 2 == 0) 1f / columns else 1f / (columns * 2)
- )
- )
- }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(height = sizeDp, expanded = true,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- val expectedWidths = Array(columns) { j ->
- min(minWidth, if (j % 2 == 0) tableWidth / columns else tableWidth / (columns * 2))
- }
-
- assertEquals(
- IntPxSize(expectedWidths.sum(), size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(expectedWidths[j], size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(expectedWidths.take(j).sum(), size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_max() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val maxWidth = 24.ipx
- val maxWidthDp = maxWidth.toDp()
- val tableWidth = 256.ipx
- val tableWidthDp = tableWidth.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack {
- ConstrainedBox(constraints = DpConstraints(maxWidth = tableWidthDp),
- modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = { j ->
- TableColumnWidth.Max(
- a = TableColumnWidth.Fixed(width = maxWidthDp),
- b = TableColumnWidth.Fraction(
- fraction = if (j % 2 == 0) 1f / columns else 1f / (columns * 2)
- )
- )
- }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(height = sizeDp, expanded = true,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- val expectedWidths = Array(columns) { j ->
- max(maxWidth, if (j % 2 == 0) tableWidth / columns else tableWidth / (columns * 2))
- }
-
- assertEquals(
- IntPxSize(expectedWidths.sum(), size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(expectedWidths[j], size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(expectedWidths.take(j).sum(), size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_min_oneWrap() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val halfSize = 32.ipx
- val halfSizeDp = halfSize.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack(modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = {
- TableColumnWidth.Min(
- a = TableColumnWidth.Wrap,
- b = TableColumnWidth.Fixed(width = sizeDp)
- )
- }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(width = halfSizeDp, height = sizeDp,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(halfSize * columns, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(halfSize, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(halfSize * j, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_max_oneWrap() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val halfSize = 32.ipx
- val halfSizeDp = halfSize.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack(modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = {
- TableColumnWidth.Max(
- a = TableColumnWidth.Wrap,
- b = TableColumnWidth.Fixed(width = sizeDp)
- )
- }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(width = halfSizeDp, height = sizeDp,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(size * columns, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(halfSize, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(size * j, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_min_twoWraps() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack(modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = {
- TableColumnWidth.Min(TableColumnWidth.Wrap, TableColumnWidth.Wrap)
- }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(width = sizeDp, height = sizeDp,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(size * columns, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(size, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(size * j, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_max_twoWraps() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack(modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = {
- TableColumnWidth.Max(TableColumnWidth.Wrap, TableColumnWidth.Wrap)
- }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(width = sizeDp, height = sizeDp,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(size * columns, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(size, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(size * j, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withColumnWidth_custom() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val halfSize = 32.ipx
- val halfSizeDp = halfSize.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- val customSpec = object : TableColumnWidth.Inflexible() {
- override fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx {
- return cells.first().preferredWidth()
- }
- }
-
- show {
- Stack(modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = { customSpec }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(
- width = if (i == 0) sizeDp else halfSizeDp,
- height = sizeDp,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(size * columns, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(if (i == 0) size else halfSize, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(size * j, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withDifferentRowHeights() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val halfSize = 32.ipx
- val halfSizeDp = halfSize.toDp()
- val tableWidth = 256.ipx
- val tableWidthDp = tableWidth.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack {
- ConstrainedBox(constraints = DpConstraints(maxWidth = tableWidthDp),
- modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(
- height = if (j % 2 == 0) sizeDp else halfSizeDp,
- expanded = true,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(tableWidth, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(tableWidth / columns, if (j % 2 == 0) size else halfSize),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(tableWidth * j / columns, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_withDifferentColumnWidths() = with(density) {
- val rows = 8
- val columns = 5
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val halfSize = 32.ipx
- val halfSizeDp = halfSize.toDp()
- val tableWidth = 256.ipx
- val tableWidthDp = tableWidth.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val positionedLatch = CountDownLatch(rows * columns + 1)
-
- show {
- Stack {
- ConstrainedBox(constraints = DpConstraints(maxWidth = tableWidthDp),
- modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- positionedLatch.countDown()
- }
- ) {
- Table(columns = columns, columnWidth = { j ->
- when (j) {
- 0 -> TableColumnWidth.Wrap
- 1 -> TableColumnWidth.Flex(flex = 1f)
- 2 -> TableColumnWidth.Flex(flex = 3f)
- 3 -> TableColumnWidth.Fixed(width = sizeDp)
- else -> TableColumnWidth.Fraction(fraction = 0.5f)
- }
- }) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(
- width = if (j == 0) halfSizeDp else null,
- height = sizeDp,
- expanded = j != 0,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- positionedLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
- }
-
- assertTrue(positionedLatch.await(1, TimeUnit.SECONDS))
-
- assertEquals(
- IntPxSize(tableWidth, size * rows),
- tableSize.value
- )
- for (i in 0 until rows) {
- // Wrap column 0
- assertEquals(
- IntPxSize(halfSize, size),
- childSize[i][0].value
- )
- assertEquals(
- PxPosition(0.ipx, size * i),
- childPosition[i][0].value
- )
- // Flex column 1
- assertEquals(
- IntPxSize((tableWidth / 2 - size - halfSize) / 4, size),
- childSize[i][1].value
- )
- assertEquals(
- PxPosition(halfSize, size * i),
- childPosition[i][1].value
- )
- // Flex column 2
- assertEquals(
- IntPxSize((tableWidth / 2 - size - halfSize) * 3 / 4, size),
- childSize[i][2].value
- )
- assertEquals(
- PxPosition(halfSize + (tableWidth / 2 - size - halfSize) / 4, size * i),
- childPosition[i][2].value
- )
- // Fixed column 3
- assertEquals(
- IntPxSize(size, size),
- childSize[i][3].value
- )
- assertEquals(
- PxPosition(tableWidth / 2 - size, size * i),
- childPosition[i][3].value
- )
- // Fraction column 4
- assertEquals(
- IntPxSize(tableWidth / 2, size),
- childSize[i][4].value
- )
- assertEquals(
- PxPosition(tableWidth / 2, size * i),
- childPosition[i][4].value
- )
- }
- }
-
- @Test
- fun testTable_withDecorations() = with(density) {
- val rows = 8
- val columns = 8
- val decorations = 3
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val tableWidth = 256.ipx
- val tableWidthDp = tableWidth.toDp()
-
- val tableSize = Ref<IntPxSize>()
- val decorationSize = Array(decorations) { Ref<IntPxSize>() }
- val decorationPosition = Array(decorations) { Ref<PxPosition>() }
- val childSize = Array(rows) { Array(columns) { Ref<IntPxSize>() } }
- val childPosition = Array(rows) { Array(columns) { Ref<PxPosition>() } }
- val tableLatch = CountDownLatch(1)
- val decorationsLatch = CountDownLatch(decorations)
- val itemsLatch = CountDownLatch(rows * columns)
-
- show {
- Stack {
- ConstrainedBox(constraints = DpConstraints(maxWidth = tableWidthDp),
- modifier = Modifier.onChildPositioned { coordinates: LayoutCoordinates ->
- tableSize.value = coordinates.size
- tableLatch.countDown()
- }
- ) {
- Table(columns = columns) {
- for (i in 0 until decorations) {
- tableDecoration(overlay = true) {
- Container(
- Modifier.saveLayoutInfo(
- size = decorationSize[i],
- position = decorationPosition[i],
- positionedLatch = decorationsLatch
- )
- ) {
- }
- }
- }
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(height = sizeDp, expanded = true,
- modifier = Modifier.saveLayoutInfo(
- childSize[i][j],
- childPosition[i][j],
- itemsLatch
- )
- ) {
- }
- }
- }
- }
- }
- }
- }
- }
-
- tableLatch.await(1, TimeUnit.SECONDS)
- decorationsLatch.await(1, TimeUnit.SECONDS)
- itemsLatch.await(1, TimeUnit.SECONDS)
-
- assertEquals(
- IntPxSize(tableWidth, size * rows),
- tableSize.value
- )
- for (i in 0 until decorations) {
- assertEquals(
- IntPxSize(tableWidth, size * rows),
- decorationSize[i].value
- )
- assertEquals(
- PxPosition(IntPx.Zero, IntPx.Zero),
- decorationPosition[i].value
- )
- }
- for (i in 0 until rows) {
- for (j in 0 until columns) {
- assertEquals(
- IntPxSize(tableWidth / columns, size),
- childSize[i][j].value
- )
- assertEquals(
- PxPosition(tableWidth * j / columns, size * i),
- childPosition[i][j].value
- )
- }
- }
- }
-
- @Test
- fun testTable_hasCorrectIntrinsicMeasurements_flex() = with(density) {
- val rows = 8
- val columns = 8
-
- val testDimension = 256.ipx
-
- testIntrinsics(
- @Composable {
- Table(
- columns = columns,
- columnWidth = { TableColumnWidth.Flex(flex = 1f) }
- ) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(Modifier.aspectRatio(2f)) { }
- }
- }
- }
- }
- }
- ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
- // Min width
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Zero))
- assertEquals(0.ipx, minIntrinsicWidth(testDimension))
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Infinity))
-
- // Min height
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Zero))
- assertEquals(testDimension / columns / 2 * rows, minIntrinsicHeight(testDimension))
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Infinity))
-
- // Max width
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Zero))
- assertEquals(0.ipx, maxIntrinsicWidth(testDimension))
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Infinity))
-
- // Max height
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Zero))
- assertEquals(testDimension / columns / 2 * rows, maxIntrinsicHeight(testDimension))
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Infinity))
- }
- }
-
- @Test
- fun testTable_hasCorrectIntrinsicMeasurements_wrap() = with(density) {
- val rows = 8
- val columns = 8
-
- val testDimension = 256.ipx
-
- testIntrinsics(
- @Composable {
- Table(
- columns = columns,
- columnWidth = { TableColumnWidth.Wrap }
- ) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(Modifier.aspectRatio(2f)) { }
- }
- }
- }
- }
- }
- ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
- // Min width
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Zero))
- assertEquals(testDimension * columns * 2 / rows, minIntrinsicWidth(testDimension))
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Infinity))
-
- // Min height
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Zero))
- assertEquals(0.ipx, minIntrinsicHeight(testDimension))
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Infinity))
-
- // Max width
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Zero))
- assertEquals(testDimension * columns * 2 / rows, maxIntrinsicWidth(testDimension))
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Infinity))
-
- // Max height
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Zero))
- assertEquals(0.ipx, maxIntrinsicHeight(testDimension))
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Infinity))
- }
- }
-
- @Test
- fun testTable_hasCorrectIntrinsicMeasurements_wrap_flexible() = with(density) {
- val rows = 8
- val columns = 8
-
- val testDimension = 256.ipx
-
- testIntrinsics(
- @Composable {
- Table(
- columns = columns,
- columnWidth = { TableColumnWidth.Wrap.flexible(flex = 1f) }
- ) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(Modifier.aspectRatio(2f)) { }
- }
- }
- }
- }
- }
- ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
- // Min width
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Zero))
- assertEquals(testDimension * columns * 2 / rows, minIntrinsicWidth(testDimension))
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Infinity))
-
- // Min height
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Zero))
- assertEquals(testDimension / columns / 2 * rows, minIntrinsicHeight(testDimension))
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Infinity))
-
- // Max width
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Zero))
- assertEquals(testDimension * columns * 2 / rows, maxIntrinsicWidth(testDimension))
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Infinity))
-
- // Max height
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Zero))
- assertEquals(testDimension / columns / 2 * rows, maxIntrinsicHeight(testDimension))
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Infinity))
- }
- }
-
- @Test
- fun testTable_hasCorrectIntrinsicMeasurements_minIntrinsic() = with(density) {
- val rows = 8
- val columns = 8
-
- val testDimension = 256.ipx
-
- testIntrinsics(
- @Composable {
- Table(
- columns = columns,
- columnWidth = { TableColumnWidth.MinIntrinsic }
- ) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(Modifier.aspectRatio(2f)) { }
- }
- }
- }
- }
- }
- ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
- // Min width
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Zero))
- assertEquals(testDimension * columns * 2 / rows, minIntrinsicWidth(testDimension))
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Infinity))
-
- // Min height
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Zero))
- assertEquals(0.ipx, minIntrinsicHeight(testDimension))
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Infinity))
-
- // Max width
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Zero))
- assertEquals(testDimension * columns * 2 / rows, maxIntrinsicWidth(testDimension))
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Infinity))
-
- // Max height
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Zero))
- assertEquals(0.ipx, maxIntrinsicHeight(testDimension))
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Infinity))
- }
- }
-
- @Test
- fun testTable_hasCorrectIntrinsicMeasurements_maxIntrinsic() = with(density) {
- val rows = 8
- val columns = 8
-
- val testDimension = 256.ipx
-
- testIntrinsics(
- @Composable {
- Table(
- columns = columns,
- columnWidth = { TableColumnWidth.MaxIntrinsic }
- ) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(Modifier.aspectRatio(2f)) { }
- }
- }
- }
- }
- }
- ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
- // Min width
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Zero))
- assertEquals(testDimension * columns * 2 / rows, minIntrinsicWidth(testDimension))
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Infinity))
-
- // Min height
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Zero))
- assertEquals(0.ipx, minIntrinsicHeight(testDimension))
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Infinity))
-
- // Max width
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Zero))
- assertEquals(testDimension * columns * 2 / rows, maxIntrinsicWidth(testDimension))
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Infinity))
-
- // Max height
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Zero))
- assertEquals(0.ipx, maxIntrinsicHeight(testDimension))
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Infinity))
- }
- }
-
- @Test
- fun testTable_hasCorrectIntrinsicMeasurements_fixed() = with(density) {
- val rows = 8
- val columns = 8
-
- val size = 64.ipx
- val sizeDp = size.toDp()
- val testDimension = 256.ipx
-
- testIntrinsics(
- @Composable {
- Table(
- columns = columns,
- columnWidth = { TableColumnWidth.Fixed(width = sizeDp) }
- ) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(Modifier.aspectRatio(2f)) { }
- }
- }
- }
- }
- }
- ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
- // Min width
- assertEquals(size * 8, minIntrinsicWidth(IntPx.Zero))
- assertEquals(size * 8, minIntrinsicWidth(testDimension))
- assertEquals(size * 8, minIntrinsicWidth(IntPx.Infinity))
-
- // Min height
- assertEquals(size * 4, minIntrinsicHeight(IntPx.Zero))
- assertEquals(size * 4, minIntrinsicHeight(testDimension))
- assertEquals(size * 4, minIntrinsicHeight(IntPx.Infinity))
-
- // Max width
- assertEquals(size * 8, maxIntrinsicWidth(IntPx.Zero))
- assertEquals(size * 8, maxIntrinsicWidth(testDimension))
- assertEquals(size * 8, maxIntrinsicWidth(IntPx.Infinity))
-
- // Max height
- assertEquals(size * 4, maxIntrinsicHeight(IntPx.Zero))
- assertEquals(size * 4, maxIntrinsicHeight(testDimension))
- assertEquals(size * 4, maxIntrinsicHeight(IntPx.Infinity))
- }
- }
-
- @Test
- fun testTable_hasCorrectIntrinsicMeasurements_fraction() = with(density) {
- val rows = 8
- val columns = 8
-
- val testDimension = 256.ipx
-
- testIntrinsics(
- @Composable {
- Table(
- columns = columns,
- columnWidth = { TableColumnWidth.Fraction(fraction = 1f / columns) }
- ) {
- for (i in 0 until rows) {
- tableRow {
- for (j in 0 until columns) {
- Container(Modifier.aspectRatio(2f)) { }
- }
- }
- }
- }
- }
- ) { minIntrinsicWidth, minIntrinsicHeight, maxIntrinsicWidth, maxIntrinsicHeight ->
- // Min width
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Zero))
- assertEquals(0.ipx, minIntrinsicWidth(testDimension))
- assertEquals(0.ipx, minIntrinsicWidth(IntPx.Infinity))
-
- // Min height
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Zero))
- assertEquals(testDimension / 2, minIntrinsicHeight(testDimension))
- assertEquals(0.ipx, minIntrinsicHeight(IntPx.Infinity))
-
- // Max width
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Zero))
- assertEquals(0.ipx, maxIntrinsicWidth(testDimension))
- assertEquals(0.ipx, maxIntrinsicWidth(IntPx.Infinity))
-
- // Max height
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Zero))
- assertEquals(testDimension / 2, maxIntrinsicHeight(testDimension))
- assertEquals(0.ipx, maxIntrinsicHeight(IntPx.Infinity))
- }
- }
-
- private fun Array<IntPx>.sum() = this.fold(IntPx.Zero) { a, b -> a + b }
- private fun Collection<IntPx>.sum() = this.fold(IntPx.Zero) { a, b -> a + b }
-}
\ No newline at end of file
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Container.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Container.kt
deleted file mode 100644
index 2b49e7a..0000000
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Container.kt
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2019 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.ui.layout
-
-import androidx.compose.Composable
-import androidx.ui.core.Alignment
-import androidx.ui.core.Constraints
-import androidx.ui.core.Layout
-import androidx.ui.core.Modifier
-import androidx.ui.core.Placeable
-import androidx.ui.core.enforce
-import androidx.ui.core.hasFixedHeight
-import androidx.ui.core.hasFixedWidth
-import androidx.ui.core.offset
-import androidx.ui.unit.Dp
-import androidx.ui.unit.IntPxSize
-import androidx.ui.unit.dp
-import androidx.ui.unit.ipx
-import androidx.ui.unit.isFinite
-import androidx.ui.unit.max
-
-/**
- * A convenience composable that combines common layout composables for one child:
- * - padding: the padding to be applied to the child
- * - alignment: how to position the padded child if the [Container] is larger than the child
- * - constraints: additional Constraints to be enforced when measuring the Container
- * - width: the width to be used for the Container
- * - height: the height to be used for the Container
- *
- * When constraints, width and/or height are provided, these will be applied to the constraints
- * incoming from the [Container]'s parent, and might not always be satisfied if this is impossible.
- *
- * By default, the [Container] will try to be the size of its child (including padding), or as
- * small as possible within the incoming constraints if that is not possible. If expanded is
- * [true], the [Container] will be as large as possible for bounded incoming constraints.
- * If the padded child is smaller, regardless of the value of expanded, the provided alignment
- * will be used to position it. For unbounded incoming constraints, the [Container] will wrap
- * its child (same behavior as if expanded was [false]). Also, note that the measurement
- * information passed for the [Container] (constraints, width and height) will not be satisfied
- * if the incoming [Constraints] do not allow it.
- *
- * *DEPRECATED:* Container supports only one child and has params that conflict with Modifiers.
- * Use [androidx.ui.foundation.Box] instead which support multiply children, backgroundColor,
- * and set all desired size restrictions via [LayoutSize], [LayoutWidth], [LayoutHeight] and
- * other modifiers.
- */
-@Deprecated(
- "Use Box instead. Container supports only one child and has params that conflict with " +
- "Modifiers, Box solves these problem and have more convenience params."
-)
-@Composable
-fun Container(
- modifier: Modifier = Modifier,
- padding: InnerPadding = InnerPadding(0.dp),
- alignment: Alignment = Alignment.Center,
- expanded: Boolean = false,
- constraints: DpConstraints = DpConstraints(),
- width: Dp? = null,
- height: Dp? = null,
- children: @Composable() () -> Unit
-) {
- Layout(children, modifier) { measurables, incomingConstraints, _ ->
- val containerConstraints = Constraints(constraints)
- .copy(
- width?.toIntPx() ?: constraints.minWidth.toIntPx(),
- width?.toIntPx() ?: constraints.maxWidth.toIntPx(),
- height?.toIntPx() ?: constraints.minHeight.toIntPx(),
- height?.toIntPx() ?: constraints.maxHeight.toIntPx()
- ).enforce(incomingConstraints)
- val totalHorizontal = padding.start.toIntPx() + padding.end.toIntPx()
- val totalVertical = padding.top.toIntPx() + padding.bottom.toIntPx()
- val childConstraints = containerConstraints
- .copy(minWidth = 0.ipx, minHeight = 0.ipx)
- .offset(-totalHorizontal, -totalVertical)
- var placeable: Placeable? = null
- val containerWidth = if ((containerConstraints.hasFixedWidth || expanded) &&
- containerConstraints.maxWidth.isFinite()
- ) {
- containerConstraints.maxWidth
- } else {
- placeable = measurables.firstOrNull()?.measure(childConstraints)
- max((placeable?.width ?: 0.ipx) + totalHorizontal, containerConstraints.minWidth)
- }
- val containerHeight = if ((containerConstraints.hasFixedHeight || expanded) &&
- containerConstraints.maxHeight.isFinite()
- ) {
- containerConstraints.maxHeight
- } else {
- if (placeable == null) {
- placeable = measurables.firstOrNull()?.measure(childConstraints)
- }
- max((placeable?.height ?: 0.ipx) + totalVertical, containerConstraints.minHeight)
- }
- layout(containerWidth, containerHeight) {
- val p = placeable ?: measurables.firstOrNull()?.measure(childConstraints)
- p?.let {
- val position = alignment.align(
- IntPxSize(
- containerWidth - it.width - totalHorizontal,
- containerHeight - it.height - totalVertical
- )
- )
- it.place(
- padding.start.toIntPx() + position.x,
- padding.top.toIntPx() + position.y
- )
- }
- }
- }
-}
diff --git a/ui/ui-layout/src/main/java/androidx/ui/layout/Table.kt b/ui/ui-layout/src/main/java/androidx/ui/layout/Table.kt
deleted file mode 100644
index b4dbd49..0000000
--- a/ui/ui-layout/src/main/java/androidx/ui/layout/Table.kt
+++ /dev/null
@@ -1,791 +0,0 @@
-/*
- * Copyright 2019 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.ui.layout
-
-import androidx.annotation.FloatRange
-import androidx.compose.Composable
-import androidx.compose.getValue
-import androidx.compose.setValue
-import androidx.compose.state
-import androidx.ui.core.Alignment
-import androidx.ui.core.Constraints
-import androidx.ui.core.IntrinsicMeasurable
-import androidx.ui.core.IntrinsicMeasureBlock
-import androidx.ui.core.IntrinsicMeasureScope
-import androidx.ui.core.Layout
-import androidx.ui.core.ParentData
-import androidx.ui.core.Placeable
-import androidx.ui.core.constrain
-import androidx.ui.unit.Density
-import androidx.ui.unit.Dp
-import androidx.ui.unit.IntPx
-import androidx.ui.unit.IntPxSize
-import androidx.ui.unit.isFinite
-import androidx.ui.unit.max
-import androidx.ui.unit.min
-
-/**
- * Collects information about the children of a [Table] when
- * its body is executed with a [TableChildren] as argument.
- */
-@LayoutScopeMarker
-class TableChildren internal constructor() {
- internal val tableChildren = mutableListOf<@Composable() () -> Unit>()
- internal val tableDecorationsOverlay = mutableListOf<TableDecoration>()
- internal val tableDecorationsUnderlay = mutableListOf<TableDecoration>()
-
- /**
- * Creates a new row in the [Table] with the specified content.
- */
- fun tableRow(children: @Composable() () -> Unit) {
- val rowIndex = tableChildren.size
- tableChildren += {
- // TODO(b/150139220) ParentData composable will be removed as soon as Table's API is
- // migrated
- @Suppress("DEPRECATION")
- ParentData(data = TableChildData(rowIndex), children = children)
- }
- }
-
- /**
- * Adds a decoration which will be placed either above or below the content of the [Table].
- * This can be either a component, such as Layout or SizedRectangle, or a Draw composable.
- * Note that decorations are measured with tight constraints to fill the size of the [Table],
- * and the offsets of each row and column of the [Table] are available inside the body of this.
- *
- * Example usage:
- *
- * @sample androidx.ui.layout.samples.TableWithDecorations
- *
- * @param overlay Whether the decoration is placed above (true) or below (false) the content.
- */
- fun tableDecoration(overlay: Boolean, decoration: TableDecoration) {
- if (overlay) {
- tableDecorationsOverlay += decoration
- } else {
- tableDecorationsUnderlay += decoration
- }
- }
-}
-
-/**
- * Collects the vertical/horizontal offsets of each row/column of a [Table] that are available
- * to a [TableDecoration] when its body is executed on a [TableDecorationChildren] instance.
- */
-data class TableDecorationChildren internal constructor(
- val verticalOffsets: List<IntPx>,
- val horizontalOffsets: List<IntPx>
-)
-
-typealias TableDecoration = @Composable TableDecorationChildren.() -> Unit
-
-/**
- * Parent data associated with children to assign a row group.
- */
-private data class TableChildData(val rowIndex: Int)
-
-private val IntrinsicMeasurable.rowIndex get() = (parentData as? TableChildData)?.rowIndex
-
-/**
- * Used to specify the size of a [Table]'s column.
- */
-abstract class TableColumnWidth private constructor(internal val flexValue: Float) {
- /**
- * Returns the ideal width of the column.
- *
- * Note that the column might be wider than this if it is flexible.
- */
- abstract fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx
-
- /**
- * Returns the minimum intrinsic width of the column for the given height.
- *
- * This is used for computing the table's intrinsic dimensions. Defaults to [preferredWidth].
- */
- open fun minIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return preferredWidth(cells, containerWidth, density)
- }
-
- /**
- * Returns the minimum intrinsic width of the column for the given height.
- *
- * This is used for computing the table's intrinsic dimensions. Defaults to [preferredWidth].
- */
- open fun maxIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return preferredWidth(cells, containerWidth, density)
- }
-
- /**
- * An inflexible column has a fixed size which is computed by [preferredWidth].
- */
- abstract class Inflexible : TableColumnWidth(flexValue = 0f) {
- /**
- * Creates a column width specification which defaults to the width specified by the
- * [preferredWidth] of the receiver, but may also grow by taking a part of the remaining
- * space according to the given [flex] once all the inflexible columns have been measured.
- */
- fun flexible(flex: Float): TableColumnWidth = Flexible(flex, this)
- }
-
- private data class Flexible(val flex: Float, val other: Inflexible) : TableColumnWidth(flex) {
-
- override fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx {
- return other.preferredWidth(cells, containerWidth, density)
- }
-
- override fun minIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return other.minIntrinsicWidth(cells, containerWidth, density, availableHeight)
- }
-
- override fun maxIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return other.maxIntrinsicWidth(cells, containerWidth, density, availableHeight)
- }
- }
-
- /**
- * Sizes the column by taking a part of the remaining space according to [flex] once all the
- * inflexible columns have been measured. Note that this defaults to 0 if no space is available.
- */
- data class Flex(@FloatRange(from = 0.0) private val flex: Float) : TableColumnWidth(flex) {
-
- override fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx {
- return IntPx.Zero
- }
- }
-
- /**
- * Sizes the column to the width of the widest child in that column.
- *
- * Note that, in order to compute their preferred widths, the children will be measured with
- * infinite width constraints to prevent them from filling the available space. For a
- * wrap content behaviour without infinite measurements, use [minIntrinsicWidth] or
- * [maxIntrinsicWidth].
- */
- object Wrap : Inflexible() {
-
- override fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx {
- return cells.fold(IntPx.Zero) { acc, cell ->
- max(acc, cell.preferredWidth())
- }
- }
-
- override fun minIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return cells.fold(IntPx.Zero) { acc, cell ->
- max(acc, cell.minIntrinsicWidth(availableHeight / cells.size))
- }
- }
-
- override fun maxIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return cells.fold(IntPx.Zero) { acc, cell ->
- max(acc, cell.maxIntrinsicWidth(availableHeight / cells.size))
- }
- }
- }
-
- /**
- * Sizes the column to the largest of the minimum intrinsic widths of the children in that
- * column (i.e. the minimum width such that children can layout/paint themselves correctly).
- *
- * Note that this is a very expensive way to size a column. For a wrap content behaviour that
- * skips the intrinsic measurements which compute the column width before measuring, use [Wrap].
- */
- object MinIntrinsic : Inflexible() {
-
- override fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx {
- return cells.fold(IntPx.Zero) { acc, cell ->
- max(acc, cell.minIntrinsicWidth(IntPx.Infinity))
- }
- }
-
- override fun minIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return cells.fold(IntPx.Zero) { acc, cell ->
- max(acc, cell.minIntrinsicWidth(availableHeight / cells.size))
- }
- }
-
- override fun maxIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return cells.fold(IntPx.Zero) { acc, cell ->
- max(acc, cell.maxIntrinsicWidth(availableHeight / cells.size))
- }
- }
- }
-
- /**
- * Sizes the column to the largest of the maximum intrinsic widths of the children in that
- * column (i.e. the maximum width such that children can occupy the entire space without waste).
- *
- * Note that this is a very expensive way to size a column. For a wrap content behaviour that
- * skips the intrinsic measurements which compute the column width before measuring, use [Wrap].
- */
- object MaxIntrinsic : Inflexible() {
-
- override fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx {
- return cells.fold(IntPx.Zero) { acc, cell ->
- max(acc, cell.maxIntrinsicWidth(IntPx.Infinity))
- }
- }
-
- override fun minIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return cells.fold(IntPx.Zero) { acc, cell ->
- max(acc, cell.minIntrinsicWidth(availableHeight / cells.size))
- }
- }
-
- override fun maxIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return cells.fold(IntPx.Zero) { acc, cell ->
- max(acc, cell.maxIntrinsicWidth(availableHeight / cells.size))
- }
- }
- }
-
- /**
- * Sizes the column to a specific width.
- */
- data class Fixed(private val width: Dp) : Inflexible() {
-
- override fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx {
- return with(density) { width.toIntPx() }
- }
- }
-
- /**
- * Sizes the column to a fraction of the table's maximum width constraint.
- *
- * Note that this defaults to 0 if the maximum width constraints is infinite.
- */
- data class Fraction(
- @FloatRange(from = 0.0, to = 1.0) private val fraction: Float
- ) : Inflexible() {
-
- override fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx {
- return if (containerWidth.isFinite()) {
- containerWidth * fraction
- } else {
- IntPx.Zero
- }
- }
- }
-
- /**
- * Sizes the column to the size that is the minimum of two column width specifications.
- *
- * Both specifications are evaluated, so if either specification is expensive, so is this.
- */
- data class Min(private val a: Inflexible, private val b: Inflexible) : Inflexible() {
-
- override fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx {
- return min(
- a.preferredWidth(cells, containerWidth, density),
- b.preferredWidth(cells, containerWidth, density)
- )
- }
-
- override fun minIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return min(
- a.minIntrinsicWidth(cells, containerWidth, density, availableHeight),
- b.minIntrinsicWidth(cells, containerWidth, density, availableHeight)
- )
- }
-
- override fun maxIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return min(
- a.maxIntrinsicWidth(cells, containerWidth, density, availableHeight),
- b.maxIntrinsicWidth(cells, containerWidth, density, availableHeight)
- )
- }
- }
-
- /**
- * Sizes the column to the size that is the maximum of two column width specifications.
- *
- * Both specifications are evaluated, so if either specification is expensive, so is this.
- */
- data class Max(private val a: Inflexible, private val b: Inflexible) : Inflexible() {
-
- override fun preferredWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density
- ): IntPx {
- return max(
- a.preferredWidth(cells, containerWidth, density),
- b.preferredWidth(cells, containerWidth, density)
- )
- }
-
- override fun minIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return max(
- a.minIntrinsicWidth(cells, containerWidth, density, availableHeight),
- b.minIntrinsicWidth(cells, containerWidth, density, availableHeight)
- )
- }
-
- override fun maxIntrinsicWidth(
- cells: List<TableMeasurable>,
- containerWidth: IntPx,
- density: Density,
- availableHeight: IntPx
- ): IntPx {
- return max(
- a.maxIntrinsicWidth(cells, containerWidth, density, availableHeight),
- b.maxIntrinsicWidth(cells, containerWidth, density, availableHeight)
- )
- }
- }
-}
-
-/**
- * Collects measurements for the children of a column that
- * are available to implementations of [TableColumnWidth].
- */
-data class TableMeasurable internal constructor(
- /**
- * Computes the preferred width of the child by measuring with infinite constraints.
- */
- val preferredWidth: () -> IntPx,
-
- /**
- * Computes the minimum intrinsic width of the child for the given available height.
- */
- val minIntrinsicWidth: (IntPx) -> IntPx,
-
- /**
- * Computes the maximum intrinsic width of the child for the given available height.
- */
- val maxIntrinsicWidth: (IntPx) -> IntPx
-)
-
-/**
- * Layout model that arranges its children into rows and columns.
- *
- * Example usage:
- *
- * @sample androidx.ui.layout.samples.SimpleTable
- *
- * @sample androidx.ui.layout.samples.TableWithDifferentColumnWidths
- */
-@Composable
-fun Table(
- columns: Int,
- alignment: (columnIndex: Int) -> Alignment = { Alignment.TopStart },
- columnWidth: (columnIndex: Int) -> TableColumnWidth = { TableColumnWidth.Flex(1f) },
- children: TableChildren.() -> Unit
-) {
- var verticalOffsets by state { emptyArray<IntPx>() }
- var horizontalOffsets by state { emptyArray<IntPx>() }
-
- // NOTE(lmr): It is required that we read from verticalOffsets/horizontalOffsets so that the
- // entire Table composable gets recomposed every time they change. This used to work before
- // without us explicitly reading them here because of a compiler bug, but now that the bug is
- // fixed, this is needed. This type of pattern where we are observing the composition of the
- // children of table implicitly and building up a list of composables is a bit error prone
- // and will likely break again in the future when we move to multithreaded composition. I
- // suggest we reevaluate the architecture of this composable.
-
- @Suppress("UNUSED_EXPRESSION")
- verticalOffsets
- @Suppress("UNUSED_EXPRESSION")
- horizontalOffsets
-
- val tableChildren: @Composable() () -> Unit = with(TableChildren()) {
- apply(children); @Composable {
- val needDecorations = tableDecorationsUnderlay.isNotEmpty() ||
- tableDecorationsOverlay.isNotEmpty()
- val hasOffsets = verticalOffsets.isNotEmpty() && horizontalOffsets.isNotEmpty()
- val decorationsScope = if (needDecorations && hasOffsets) {
- TableDecorationChildren(
- verticalOffsets = verticalOffsets.toList(),
- horizontalOffsets = horizontalOffsets.toList()
- )
- } else {
- null
- }
- if (decorationsScope != null) {
- tableDecorationsUnderlay.forEach { decorationsScope.it() }
- }
- tableChildren.forEach { it() }
- if (decorationsScope != null) {
- tableDecorationsOverlay.forEach { decorationsScope.it() }
- }
- }
- }
-
- Layout(
- tableChildren,
- minIntrinsicWidthMeasureBlock = MinIntrinsicWidthMeasureBlock(columns, columnWidth),
- minIntrinsicHeightMeasureBlock = MinIntrinsicHeightMeasureBlock(columns, columnWidth),
- maxIntrinsicWidthMeasureBlock = MaxIntrinsicWidthMeasureBlock(columns, columnWidth),
- maxIntrinsicHeightMeasureBlock = MaxIntrinsicHeightMeasureBlock(columns, columnWidth)
- ) { measurables, constraints, _ ->
- val rowMeasurables = measurables.filter { it.rowIndex != null }.groupBy { it.rowIndex }
- val rows = rowMeasurables.size
- fun measurableAt(row: Int, column: Int) = rowMeasurables[row]?.getOrNull(column)
- val placeables = Array(rows) { arrayOfNulls<Placeable>(columns) }
-
- // Compute column widths and collect flex information.
- var totalFlex = 0f
- var availableSpace =
- if (constraints.maxWidth.isFinite()) constraints.maxWidth else constraints.minWidth
- val columnWidths = Array(columns) { IntPx.Zero }
- for (column in 0 until columns) {
- val spec = columnWidth(column)
- val cells = List(rows) { row ->
- TableMeasurable(
- preferredWidth = {
- placeables[row][column]?.width
- ?: measurableAt(row, column)?.measure(Constraints())
- ?.also { placeables[row][column] = it }?.width ?: IntPx.Zero
- },
- minIntrinsicWidth = {
- measurableAt(row, column)?.minIntrinsicWidth(it) ?: IntPx.Zero
- },
- maxIntrinsicWidth = {
- measurableAt(row, column)?.maxIntrinsicWidth(it) ?: IntPx.Zero
- }
- )
- }
- columnWidths[column] = spec.preferredWidth(cells, constraints.maxWidth, this)
- availableSpace -= columnWidths[column]
- totalFlex += spec.flexValue
- }
-
- // Grow flexible columns to fill available horizontal space.
- if (totalFlex > 0 && availableSpace > IntPx.Zero) {
- for (column in 0 until columns) {
- val spec = columnWidth(column)
- if (spec.flexValue > 0) {
- columnWidths[column] += availableSpace * (spec.flexValue / totalFlex)
- }
- }
- }
-
- // Measure the remaining children and calculate row heights.
- val rowHeights = Array(rows) { IntPx.Zero }
- for (row in 0 until rows) {
- for (column in 0 until columns) {
- if (placeables[row][column] == null) {
- placeables[row][column] = measurableAt(row, column)?.measure(
- Constraints(minWidth = IntPx.Zero, maxWidth = columnWidths[column])
- )
- }
- rowHeights[row] =
- max(rowHeights[row], placeables[row][column]?.height ?: IntPx.Zero)
- }
- }
-
- // Compute row/column offsets.
- val rowOffsets = Array(rows + 1) { IntPx.Zero }
- val columnOffsets = Array(columns + 1) { IntPx.Zero }
- for (row in 0 until rows) {
- rowOffsets[row + 1] = rowOffsets[row] + rowHeights[row]
- }
- for (column in 0 until columns) {
- columnOffsets[column + 1] = columnOffsets[column] + columnWidths[column]
- }
- if (!verticalOffsets.contentEquals(rowOffsets)) {
- verticalOffsets = rowOffsets
- }
- if (!horizontalOffsets.contentEquals(columnOffsets)) {
- horizontalOffsets = columnOffsets
- }
-
- // TODO(calintat): Do something when these do not satisfy constraints.
- val tableSize =
- constraints.constrain(IntPxSize(columnOffsets[columns], rowOffsets[rows]))
-
- layout(tableSize.width, tableSize.height) {
- for (row in 0 until rows) {
- for (column in 0 until columns) {
- placeables[row][column]?.let {
- val position = alignment(column).align(
- IntPxSize(
- width = columnWidths[column] - it.width,
- height = rowHeights[row] - it.height
- )
- )
- it.placeAbsolute(
- x = columnOffsets[column] + position.x,
- y = rowOffsets[row] + position.y
- )
- }
- }
- }
- val decorationConstraints =
- Constraints.fixed(tableSize.width, tableSize.height)
- measurables.filter { it.rowIndex == null }.forEach {
- it.measure(decorationConstraints).placeAbsolute(IntPx.Zero, IntPx.Zero)
- }
- }
- }
-}
-
-private val MinIntrinsicWidthMeasureBlock:
- (Int, (Int) -> TableColumnWidth) -> IntrinsicMeasureBlock =
- { columns, columnWidth ->
- { measurables, availableHeight, _ ->
- intrinsicWidth(
- columns = columns,
- columnWidth = columnWidth,
- children = measurables,
- availableHeight = availableHeight,
- minimise = true
- )
- }
- }
-
-private val MinIntrinsicHeightMeasureBlock:
- (Int, (Int) -> TableColumnWidth) -> IntrinsicMeasureBlock =
- { columns, columnWidth ->
- { measurables, availableWidth, _ ->
- intrinsicHeight(
- columns = columns,
- columnWidth = columnWidth,
- children = measurables,
- availableWidth = availableWidth,
- intrinsicHeight = { w -> minIntrinsicHeight(w) }
- )
- }
- }
-
-private val MaxIntrinsicWidthMeasureBlock:
- (Int, (Int) -> TableColumnWidth) -> IntrinsicMeasureBlock =
- { columns, columnWidth ->
- { measurables, availableHeight, _ ->
- intrinsicWidth(
- columns = columns,
- columnWidth = columnWidth,
- children = measurables,
- availableHeight = availableHeight,
- minimise = false
- )
- }
- }
-
-private val MaxIntrinsicHeightMeasureBlock:
- (Int, (Int) -> TableColumnWidth) -> IntrinsicMeasureBlock =
- { columns, columnWidth ->
- { measurables, availableWidth, _ ->
- intrinsicHeight(
- columns = columns,
- columnWidth = columnWidth,
- children = measurables,
- availableWidth = availableWidth,
- intrinsicHeight = { w -> maxIntrinsicHeight(w) }
- )
- }
- }
-
-private fun IntrinsicMeasureScope.intrinsicWidth(
- columns: Int,
- columnWidth: (columnIndex: Int) -> TableColumnWidth,
- children: List<IntrinsicMeasurable>,
- availableHeight: IntPx,
- minimise: Boolean
-): IntPx {
- val measurables = children.filter { it.rowIndex != null }.groupBy { it.rowIndex }
- val rows = measurables.size
- fun measurableAt(row: Int, column: Int) = measurables[row]?.getOrNull(column)
-
- var totalFlex = 0f
- var flexibleSpace = IntPx.Zero
- var inflexibleSpace = IntPx.Zero
-
- for (column in 0 until columns) {
- val spec = columnWidth(column)
- val cells = List(rows) { row ->
- TableMeasurable(
- preferredWidth = { IntPx.Zero },
- minIntrinsicWidth = {
- measurableAt(row, column)?.minIntrinsicWidth(it) ?: IntPx.Zero
- },
- maxIntrinsicWidth = {
- measurableAt(row, column)?.maxIntrinsicWidth(it) ?: IntPx.Zero
- }
- )
- }
- val width = if (minimise) {
- spec.minIntrinsicWidth(cells, IntPx.Infinity, this, availableHeight)
- } else {
- spec.maxIntrinsicWidth(cells, IntPx.Infinity, this, availableHeight)
- }
- if (spec.flexValue <= 0) {
- inflexibleSpace += width
- } else {
- totalFlex += spec.flexValue
- flexibleSpace = max(flexibleSpace, width / spec.flexValue)
- }
- }
- return flexibleSpace * totalFlex + inflexibleSpace
-}
-
-private fun IntrinsicMeasureScope.intrinsicHeight(
- columns: Int,
- columnWidth: (columnIndex: Int) -> TableColumnWidth,
- children: List<IntrinsicMeasurable>,
- availableWidth: IntPx,
- intrinsicHeight: IntrinsicMeasurable.(IntPx) -> IntPx
-): IntPx {
- val measurables = children.filter { it.rowIndex != null }.groupBy { it.rowIndex }
- val rows = measurables.size
- fun measurableAt(row: Int, column: Int) = measurables[row]?.getOrNull(column)
-
- // Compute column widths and collect flex information.
- var totalFlex = 0f
- var availableSpace = availableWidth
- val columnWidths = Array(columns) { IntPx.Zero }
- for (column in 0 until columns) {
- val spec = columnWidth(column)
- val cells = List(rows) { row ->
- TableMeasurable(
- preferredWidth = { IntPx.Zero },
- minIntrinsicWidth = {
- measurableAt(row, column)?.minIntrinsicWidth(it) ?: IntPx.Zero
- },
- maxIntrinsicWidth = {
- measurableAt(row, column)?.maxIntrinsicWidth(it) ?: IntPx.Zero
- }
- )
- }
- columnWidths[column] =
- spec.maxIntrinsicWidth(cells, availableWidth, this, IntPx.Infinity)
- availableSpace -= columnWidths[column]
- totalFlex += spec.flexValue
- }
-
- // Grow flexible columns to fill available horizontal space.
- if (totalFlex > 0 && availableSpace > IntPx.Zero) {
- for (column in 0 until columns) {
- val spec = columnWidth(column)
- if (spec.flexValue > 0) {
- columnWidths[column] += availableSpace * (spec.flexValue / totalFlex)
- }
- }
- }
-
- // Calculate row heights and table height.
- return (0 until rows).fold(IntPx.Zero) { tableHeight, row ->
- val rowHeight = (0 until columns).fold(IntPx.Zero) { rowHeight, column ->
- max(
- rowHeight,
- measurableAt(row, column)?.intrinsicHeight(columnWidths[column])
- ?: IntPx.Zero
- )
- }
- tableHeight + rowHeight
- }
-}
diff --git a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyAnimatedCircle.kt b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyAnimatedCircle.kt
index 17b4ab1..727b7f4 100644
--- a/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyAnimatedCircle.kt
+++ b/ui/ui-material/integration-tests/material-studies/src/main/java/androidx/ui/material/studies/rally/RallyAnimatedCircle.kt
@@ -21,16 +21,15 @@
import androidx.animation.LinearOutSlowInEasing
import androidx.animation.transitionDefinition
import androidx.compose.Composable
-import androidx.compose.remember
import androidx.ui.animation.Transition
+import androidx.ui.core.DensityAmbient
import androidx.ui.core.Modifier
-import androidx.ui.foundation.Canvas
-import androidx.ui.geometry.Rect
+import androidx.ui.foundation.Canvas2
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
-import androidx.ui.graphics.PaintingStyle
+import androidx.ui.graphics.painter.Stroke
import androidx.ui.unit.dp
-import androidx.ui.unit.minDimension
private const val DividerLengthInDegrees = 1.8f
private val AngleOffset = FloatPropKey()
@@ -67,29 +66,28 @@
proportions: List<Float>,
colors: List<Color>
) {
- val strokeWidthDp = 5.dp
- val paint = remember { Paint() }
+ val stroke = Stroke(5.dp.value * DensityAmbient.current.density)
Transition(definition = CircularTransition, initState = 0, toState = 1) { state ->
- Canvas(modifier) {
- val strokeWidth = strokeWidthDp.toPx().value
- paint.style = PaintingStyle.stroke
- paint.strokeWidth = strokeWidth
- paint.isAntiAlias = true
-
- val innerRadius = (size.minDimension.value - strokeWidth) / 2
- val parentHalfWidth = size.width.value / 2
- val parentHalfHeight = size.height.value / 2
- val rect = Rect(
- parentHalfWidth - innerRadius,
- parentHalfHeight - innerRadius,
- parentHalfWidth + innerRadius,
- parentHalfHeight + innerRadius
+ Canvas2(modifier) {
+ val innerRadius = (size.minDimension - stroke.width) / 2
+ val halfSize = size / 2.0f
+ val topLeft = Offset(
+ halfSize.width - innerRadius,
+ halfSize.height - innerRadius
)
+ val size = Size(innerRadius * 2, innerRadius * 2)
var startAngle = state[Shift] - 90f
proportions.forEachIndexed { index, proportion ->
- paint.color = colors[index]
val sweep = proportion * state[AngleOffset]
- drawArc(rect, startAngle, sweep, false, paint = paint)
+ drawArc(
+ color = colors[index],
+ startAngle = startAngle,
+ sweepAngle = sweep,
+ topLeft = topLeft,
+ size = size,
+ useCenter = false,
+ style = stroke
+ )
startAngle += sweep + DividerLengthInDegrees
}
}
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt
index ffd799b..c2310b0 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/CheckboxScreenshotTest.kt
@@ -21,6 +21,7 @@
import androidx.test.filters.SdkSuppress
import androidx.test.screenshot.AndroidXScreenshotTestRule
import androidx.test.screenshot.assertAgainstGolden
+import androidx.test.screenshot.matchers.MSSIMMatcher
import androidx.ui.core.Alignment
import androidx.ui.core.Modifier
import androidx.ui.layout.wrapContentSize
@@ -48,6 +49,8 @@
val wrap = Modifier.wrapContentSize(Alignment.TopStart)
+ val matcher = MSSIMMatcher(threshold = 0.96)
+
@Test
fun checkBoxTest_checked() {
composeTestRule.setMaterialContent {
@@ -55,7 +58,7 @@
}
find(isToggleable())
.captureToBitmap()
- .assertAgainstGolden(screenshotRule, "checkbox_checked")
+ .assertAgainstGolden(screenshotRule, "checkbox_checked", matcher)
}
@Test
@@ -65,7 +68,7 @@
}
find(isToggleable())
.captureToBitmap()
- .assertAgainstGolden(screenshotRule, "checkbox_unchecked")
+ .assertAgainstGolden(screenshotRule, "checkbox_unchecked", matcher)
}
@Test
@@ -87,7 +90,7 @@
find(isToggleable())
.captureToBitmap()
- .assertAgainstGolden(screenshotRule, "checkbox_animateToChecked")
+ .assertAgainstGolden(screenshotRule, "checkbox_animateToChecked", matcher)
}
@Test
@@ -109,6 +112,6 @@
find(isToggleable())
.captureToBitmap()
- .assertAgainstGolden(screenshotRule, "checkbox_animateToUnchecked")
+ .assertAgainstGolden(screenshotRule, "checkbox_animateToUnchecked", matcher)
}
}
\ No newline at end of file
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt
index 483189a..f6e50e8 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/ScaffoldTest.kt
@@ -16,7 +16,9 @@
package androidx.ui.material
+import android.os.Build
import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
import androidx.ui.core.LayoutCoordinates
import androidx.ui.core.Modifier
import androidx.ui.core.TestTag
@@ -364,6 +366,7 @@
assertThat(fabPosition.y).isEqualTo(expectedFabY)
}
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
@Test
fun scaffold_topAppBarIsDrawnOnTopOfContent() {
composeTestRule.setContent {
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt b/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt
index 7c9791c..951752b 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt
@@ -23,23 +23,25 @@
import androidx.compose.remember
import androidx.ui.animation.ColorPropKey
import androidx.ui.animation.Transition
+import androidx.ui.core.DensityAmbient
import androidx.ui.core.Modifier
-import androidx.ui.core.DrawScope
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.ContentGravity
import androidx.ui.foundation.selection.ToggleableState
import androidx.ui.foundation.selection.TriStateToggleable
import androidx.ui.geometry.Offset
import androidx.ui.geometry.RRect
import androidx.ui.geometry.Radius
+import androidx.ui.geometry.Size
import androidx.ui.geometry.outerRect
import androidx.ui.geometry.shrink
import androidx.ui.graphics.ClipOp
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
-import androidx.ui.graphics.PaintingStyle
import androidx.ui.graphics.StrokeCap
+import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.Stroke
+import androidx.ui.graphics.painter.clipRect
import androidx.ui.layout.padding
import androidx.ui.layout.preferredSize
import androidx.ui.material.ripple.ripple
@@ -129,43 +131,45 @@
val definition = remember(activeColor, unselectedColor) {
generateTransitionDefinition(activeColor, unselectedColor)
}
- val checkboxPaint = remember { Paint() }
Transition(definition = definition, toState = value) { state ->
- Canvas(modifier.preferredSize(CheckboxSize)) {
+ val strokeWidthPx: Float
+ val radiusPx: Float
+ with(DensityAmbient.current) {
+ strokeWidthPx = StrokeWidth.toPx().value
+ radiusPx = RadiusSize.toPx().value
+ }
+ Canvas2(modifier.preferredSize(CheckboxSize)) {
drawBox(
color = state[BoxColorProp],
innerRadiusFraction = state[InnerRadiusFractionProp],
- paint = checkboxPaint
+ radius = radiusPx,
+ strokeWidth = strokeWidthPx
)
drawCheck(
checkFraction = state[CheckFractionProp],
crossCenterGravitation = state[CenterGravitationForCheck],
- paint = checkboxPaint
+ strokeWidthPx = strokeWidthPx
)
}
}
}
-private fun DrawScope.drawBox(
+private fun CanvasScope.drawBox(
color: Color,
innerRadiusFraction: Float,
- paint: Paint
+ radius: Float,
+ strokeWidth: Float
) {
- val strokeWidth = StrokeWidth.toPx().value
val halfStrokeWidth = strokeWidth / 2.0f
- paint.style = PaintingStyle.stroke
- paint.strokeWidth = strokeWidth
- paint.isAntiAlias = true
- paint.color = color
-
- val checkboxSize = size.width.value
+ val stroke = Stroke(strokeWidth)
+ val checkboxSize = size.width
val outer = RRect(
halfStrokeWidth,
halfStrokeWidth,
checkboxSize - halfStrokeWidth,
checkboxSize - halfStrokeWidth,
- Radius.circular(RadiusSize.toPx().value)
+ Radius.circular(radius)
)
// Determine whether or not we need to offset the inset by a pixel
@@ -175,8 +179,6 @@
// TODO(malkov): this radius formula is not in material spec
- val outerRadius = RadiusSize.toPx().value
-
// If the inner region is to be filled such that it is larger than the outer stroke size
// then create a difference clip to draw the stroke outside of the rectangular region
// to be drawn within the interior rectangle. This is done to ensure that pixels do
@@ -186,41 +188,47 @@
val innerStrokeWidth = innerRadiusFraction * checkboxSize / 2
if (innerStrokeWidth > strokeWidth) {
val clipRect = outer.shrink(strokeWidth / 2 - offset).outerRect()
- save()
- clipRect(clipRect, ClipOp.difference)
- drawRoundRect(
- outer.left, outer.top, outer.right, outer.bottom, outerRadius,
- outerRadius, paint
- )
- restore()
+ val topLeft = Offset(clipRect.left, clipRect.top)
+ val size = Size(clipRect.width, clipRect.height)
+ clipRect(topLeft, size, ClipOp.difference) {
+ drawRoundRect(
+ color,
+ Offset(outer.left, outer.top),
+ Size(outer.width, outer.height),
+ radius,
+ style = stroke
+ )
+ }
- save()
- clipRect(clipRect)
- paint.strokeWidth = innerStrokeWidth
- val innerHalfStrokeWidth = paint.strokeWidth / 2
- drawRect(outer.shrink(innerHalfStrokeWidth - offset).outerRect(), paint)
- restore()
+ clipRect(topLeft, size) {
+ val innerHalfStrokeWidth = innerStrokeWidth / 2
+ val rect = outer.shrink(innerHalfStrokeWidth - offset).outerRect()
+ drawRect(
+ color = color,
+ topLeft = Offset(rect.left, rect.top),
+ size = Size(rect.width, rect.height),
+ style = Stroke(innerStrokeWidth)
+ )
+ }
} else {
drawRoundRect(
- outer.left, outer.top, outer.right, outer.bottom, outerRadius,
- outerRadius, paint
+ color,
+ topLeft = Offset(outer.left, outer.top),
+ size = Size(outer.width, outer.height),
+ radiusX = radius,
+ radiusY = radius,
+ style = stroke
)
}
}
-private fun DrawScope.drawCheck(
+private fun CanvasScope.drawCheck(
checkFraction: Float,
crossCenterGravitation: Float,
- paint: Paint
+ strokeWidthPx: Float
) {
- paint.isAntiAlias = true
- paint.style = PaintingStyle.stroke
- paint.strokeCap = StrokeCap.square
- paint.strokeWidth = StrokeWidth.toPx().value
- paint.color = CheckStrokeDefaultColor
-
- val width = size.width.value
-
+ val stroke = Stroke(width = strokeWidthPx, cap = StrokeCap.square)
+ val width = size.width
val checkCrossX = 0.4f
val checkCrossY = 0.7f
val leftX = 0.2f
@@ -244,8 +252,8 @@
width * calcMiddleValue(gravitatedCrossX, leftX, checkFraction),
width * calcMiddleValue(gravitatedCrossY, gravitatedLeftY, checkFraction)
)
- drawLine(crossPoint, leftBranch, paint)
- drawLine(crossPoint, rightBranch, paint)
+ drawLine(CheckStrokeDefaultColor, crossPoint, leftBranch, stroke)
+ drawLine(CheckStrokeDefaultColor, crossPoint, rightBranch, stroke)
}
private fun calcMiddleValue(start: Float, finish: Float, fraction: Float): Float {
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt b/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
index 8574f6a..00e85b9 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Drawer.kt
@@ -19,7 +19,6 @@
import androidx.animation.AnimatedFloat
import androidx.animation.PhysicsBuilder
import androidx.compose.Composable
-import androidx.compose.remember
import androidx.ui.core.DensityAmbient
import androidx.ui.core.Layout
import androidx.ui.core.Modifier
@@ -28,11 +27,9 @@
import androidx.ui.core.hasBoundedHeight
import androidx.ui.core.hasBoundedWidth
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.Clickable
import androidx.ui.foundation.gestures.DragDirection
-import androidx.ui.graphics.Paint
-import androidx.ui.graphics.PaintingStyle
import androidx.ui.layout.DpConstraints
import androidx.ui.layout.Stack
import androidx.ui.layout.fillMaxSize
@@ -43,7 +40,6 @@
import androidx.ui.unit.dp
import androidx.ui.unit.min
import androidx.ui.unit.px
-import androidx.ui.unit.toRect
import androidx.ui.util.lerp
/**
@@ -265,12 +261,9 @@
) {
// TODO: use enabled = false here when it will be available
val scrimContent = @Composable {
- val paint = remember { Paint().apply { style = PaintingStyle.fill } }
val color = MaterialTheme.colors.onSurface
- Canvas(Modifier.fillMaxSize()) {
- val scrimAlpha = fraction() * ScrimDefaultOpacity
- paint.color = color.copy(alpha = scrimAlpha)
- drawRect(size.toRect(), paint)
+ Canvas2(Modifier.fillMaxSize()) {
+ drawRect(color, alpha = fraction() * ScrimDefaultOpacity)
}
}
if (state == DrawerState.Opened) {
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt b/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt
index 386440d..ea4d821 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt
@@ -24,20 +24,18 @@
import androidx.animation.transitionDefinition
import androidx.annotation.FloatRange
import androidx.compose.Composable
-import androidx.compose.remember
import androidx.ui.animation.Transition
import androidx.ui.core.DensityAmbient
import androidx.ui.core.Modifier
-import androidx.ui.core.DrawScope
import androidx.ui.core.LayoutDirection
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.DeterminateProgressIndicator
import androidx.ui.geometry.Offset
-import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
-import androidx.ui.graphics.PaintingStyle
import androidx.ui.graphics.StrokeCap
+import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.Stroke
import androidx.ui.graphics.vectormath.degrees
import androidx.ui.layout.padding
import androidx.ui.layout.preferredSize
@@ -60,14 +58,16 @@
color: Color = MaterialTheme.colors.primary
) {
DeterminateProgressIndicator(progress = progress) {
- val paint = paint(color, StrokeCap.butt)
- val backgroundPaint = paint(
- color.copy(alpha = BackgroundOpacity),
- StrokeCap.butt
- )
- Canvas(modifier.preferredSize(LinearIndicatorWidth, LinearIndicatorHeight)) {
- drawLinearIndicatorBackground(backgroundPaint)
- drawLinearIndicator(0f, progress, paint)
+ val stroke = with(DensityAmbient.current) {
+ Stroke(
+ width = ProgressIndicatorConstants.DefaultStrokeWidth.toPx().value,
+ cap = StrokeCap.butt
+ )
+ }
+ val backgroundColor = color.copy(alpha = BackgroundOpacity)
+ Canvas2(modifier.preferredSize(LinearIndicatorWidth, LinearIndicatorHeight)) {
+ drawLinearIndicatorBackground(backgroundColor, stroke)
+ drawLinearIndicator(0f, progress, color, stroke)
}
}
}
@@ -92,30 +92,42 @@
val firstLineTail = state[FirstLineTailProp]
val secondLineHead = state[SecondLineHeadProp]
val secondLineTail = state[SecondLineTailProp]
- val paint = paint(color, StrokeCap.butt)
- val backgroundPaint = paint(
- color.copy(alpha = BackgroundOpacity),
- StrokeCap.butt
- )
- Canvas(modifier.preferredSize(LinearIndicatorWidth, LinearIndicatorHeight)) {
- drawLinearIndicatorBackground(backgroundPaint)
+ val backgroundColor = color.copy(alpha = BackgroundOpacity)
+ val stroke = with(DensityAmbient.current) {
+ Stroke(
+ width = ProgressIndicatorConstants.DefaultStrokeWidth.toPx().value,
+ cap = StrokeCap.butt
+ )
+ }
+ Canvas2(modifier.preferredSize(LinearIndicatorWidth, LinearIndicatorHeight)) {
+ drawLinearIndicatorBackground(backgroundColor, stroke)
if (firstLineHead - firstLineTail > 0) {
- drawLinearIndicator(firstLineHead, firstLineTail, paint)
+ drawLinearIndicator(
+ firstLineHead,
+ firstLineTail,
+ color,
+ stroke)
}
if ((secondLineHead - secondLineTail) > 0) {
- drawLinearIndicator(secondLineHead, secondLineTail, paint)
+ drawLinearIndicator(
+ secondLineHead,
+ secondLineTail,
+ color,
+ stroke)
}
}
}
}
-private fun DrawScope.drawLinearIndicator(
+private fun CanvasScope.drawLinearIndicator(
startFraction: Float,
endFraction: Float,
- paint: Paint
+ color: Color,
+ stroke: Stroke,
+ layoutDirection: LayoutDirection = LayoutDirection.Ltr
) {
- val width = size.width.value
- val height = size.height.value
+ val width = size.width
+ val height = size.height
// Start drawing from the vertical center of the stroke
val yOffset = height / 2
@@ -124,11 +136,14 @@
val barEnd = (if (isLtr) endFraction else 1f - startFraction) * width
// Progress line
- drawLine(Offset(barStart, yOffset), Offset(barEnd, yOffset), paint)
+ drawLine(color, Offset(barStart, yOffset), Offset(barEnd, yOffset), stroke)
}
-private fun DrawScope.drawLinearIndicatorBackground(paint: Paint) =
- drawLinearIndicator(0f, 1f, paint)
+private fun CanvasScope.drawLinearIndicatorBackground(
+ color: Color,
+ stroke: Stroke,
+ layoutDirection: LayoutDirection = LayoutDirection.Ltr
+) = drawLinearIndicator(0f, 1f, color, stroke, layoutDirection)
/**
* A determinate circular progress indicator that represents progress by drawing an arc ranging from
@@ -147,8 +162,10 @@
strokeWidth: Dp = ProgressIndicatorConstants.DefaultStrokeWidth
) {
DeterminateProgressIndicator(progress = progress) {
- val paint = paint(color, StrokeCap.butt, strokeWidth)
- Canvas(
+ val stroke = with(DensityAmbient.current) {
+ Stroke(width = strokeWidth.toPx().value, cap = StrokeCap.butt)
+ }
+ Canvas2(
modifier
.padding(CircularIndicatorPadding)
.preferredSize(CircularIndicatorDiameter)
@@ -156,7 +173,7 @@
// Start at 12 O'clock
val startAngle = 270f
val sweep = progress * 360f
- drawDeterminateCircularIndicator(startAngle, sweep, paint)
+ drawDeterminateCircularIndicator(startAngle, sweep, color, stroke)
}
}
}
@@ -174,7 +191,9 @@
color: Color = MaterialTheme.colors.primary,
strokeWidth: Dp = ProgressIndicatorConstants.DefaultStrokeWidth
) {
- val paint = paint(color, StrokeCap.square, strokeWidth)
+ val stroke = with(DensityAmbient.current) {
+ Stroke(width = strokeWidth.toPx().value, cap = StrokeCap.square)
+ }
Transition(
definition = CircularIndeterminateTransition,
initState = 0,
@@ -194,29 +213,34 @@
startAngle += StartAngleOffset + currentRotationAngleOffset
startAngle += baseRotation
- Canvas(
+ Canvas2(
modifier.padding(CircularIndicatorPadding)
.preferredSize(CircularIndicatorDiameter)
) {
- drawIndeterminateCircularIndicator(startAngle, strokeWidth, sweep, paint)
+ drawIndeterminateCircularIndicator(startAngle, strokeWidth, sweep, color, stroke)
}
}
}
-private fun DrawScope.drawCircularIndicator(startAngle: Float, sweep: Float, paint: Paint) {
- val diameter = size.width.value
+private fun CanvasScope.drawCircularIndicator(
+ startAngle: Float,
+ sweep: Float,
+ color: Color,
+ stroke: Stroke
+) {
// To draw this circle we need a rect with edges that line up with the midpoint of the stroke.
// To do this we need to remove half the stroke width from the total diameter for both sides.
- val diameterOffset = paint.strokeWidth / 2
-
- val left = diameterOffset
- val right = diameter - diameterOffset
-
- val top = diameterOffset
- val bottom = diameter - diameterOffset
-
- val rect = Rect.fromLTRB(left, top, right, bottom)
- drawArc(rect, startAngle, sweep, false, paint)
+ val diameterOffset = stroke.width / 2
+ val arcDimen = size.width - 2 * diameterOffset
+ drawArc(
+ color = color,
+ startAngle = startAngle,
+ sweepAngle = sweep,
+ useCenter = false,
+ topLeft = Offset(diameterOffset, diameterOffset),
+ size = Size(arcDimen, arcDimen),
+ style = stroke
+ )
}
/**
@@ -233,17 +257,19 @@
val DefaultStrokeWidth = 4.dp
}
-private fun DrawScope.drawDeterminateCircularIndicator(
+private fun CanvasScope.drawDeterminateCircularIndicator(
startAngle: Float,
sweep: Float,
- paint: Paint
-) = drawCircularIndicator(startAngle, sweep, paint)
+ color: Color,
+ stroke: Stroke
+) = drawCircularIndicator(startAngle, sweep, color, stroke)
-private fun DrawScope.drawIndeterminateCircularIndicator(
+private fun CanvasScope.drawIndeterminateCircularIndicator(
startAngle: Float,
strokeWidth: Dp,
sweep: Float,
- paint: Paint
+ color: Color,
+ stroke: Stroke
) {
// Length of arc is angle * radius
// Angle (radians) is length / radius
@@ -258,7 +284,7 @@
// the stroke caps get added on both ends and we draw the correct minimum length arc
val adjustedSweep = max(sweep, 0.1f)
- drawCircularIndicator(adjustedStartAngle, adjustedSweep, paint)
+ drawCircularIndicator(adjustedStartAngle, adjustedSweep, color, stroke)
}
// LinearProgressIndicator Material specs
@@ -441,20 +467,3 @@
}
}
}
-
-@Composable
-private fun paint(
- color: Color,
- strokeCap: StrokeCap,
- strokeWidth: Dp = ProgressIndicatorConstants.DefaultStrokeWidth
-): Paint = with(DensityAmbient.current) {
- remember {
- Paint().apply {
- style = PaintingStyle.stroke
- this.strokeWidth = strokeWidth.toPx().value
- }
- }.apply {
- this.color = color
- this.strokeCap = strokeCap
- }
-}
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt b/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt
index 083dbab..9727e47 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt
@@ -23,16 +23,16 @@
import androidx.ui.animation.ColorPropKey
import androidx.ui.animation.DpPropKey
import androidx.ui.animation.Transition
+import androidx.ui.core.DensityAmbient
import androidx.ui.core.Modifier
-import androidx.ui.core.DrawScope
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.Text
import androidx.ui.foundation.selection.MutuallyExclusiveSetItem
import androidx.ui.geometry.Offset
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
-import androidx.ui.graphics.PaintingStyle
+import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.Stroke
import androidx.ui.layout.Column
import androidx.ui.layout.Row
import androidx.ui.layout.Stack
@@ -42,7 +42,6 @@
import androidx.ui.material.ripple.ripple
import androidx.ui.semantics.Semantics
import androidx.ui.text.TextStyle
-import androidx.ui.unit.Dp
import androidx.ui.unit.dp
/**
@@ -198,7 +197,6 @@
onSelect: (() -> Unit)?,
color: Color = MaterialTheme.colors.secondary
) {
- val radioPaint = remember { Paint() }
Stack {
MutuallyExclusiveSetItem(
selected = selected, onClick = { if (!selected) onSelect?.invoke() },
@@ -210,13 +208,23 @@
generateTransitionDefinition(color, unselectedColor)
}
Transition(definition = definition, toState = selected) { state ->
- Canvas(Modifier.padding(RadioButtonPadding).preferredSize(RadioButtonSize)) {
+ val outerPx: Float
+ val innerPx: Float
+ val gapWidth: Float
+ val radioStroke: Stroke
+ with(DensityAmbient.current) {
+ outerPx = state[OuterRadiusProp].toPx().value
+ innerPx = state[InnerRadiusProp].toPx().value
+ gapWidth = state[GapProp].toPx().value
+ radioStroke = Stroke(RadioStrokeWidth.toPx().value)
+ }
+ Canvas2(Modifier.padding(RadioButtonPadding).preferredSize(RadioButtonSize)) {
drawRadio(
state[ColorProp],
- state[OuterRadiusProp],
- state[InnerRadiusProp],
- state[GapProp],
- radioPaint
+ outerPx,
+ innerPx,
+ gapWidth,
+ radioStroke
)
}
}
@@ -224,40 +232,28 @@
}
}
-private fun DrawScope.drawRadio(
+private fun CanvasScope.drawRadio(
color: Color,
- outerRadius: Dp,
- innerRadius: Dp,
- gap: Dp,
- paint: Paint
+ outerPx: Float,
+ innerPx: Float,
+ gapWidth: Float,
+ radioStroke: Stroke
) {
- paint.isAntiAlias = true
- paint.color = color
-
// TODO(malkov): currently Radio gravity is always CENTER but we need to be flexible
- val centerW = size.width.value / 2
- val centerH = size.height.value / 2
- val outerPx = outerRadius.toPx().value
- val innerPx = innerRadius.toPx().value
+ val centerW = center.dx
+ val centerH = center.dy
val center = Offset(centerW, centerH)
- if (gap == 0.dp) {
+ if (gapWidth == 0.0f) {
val strokeWidth = outerPx - innerPx
- paint.style = PaintingStyle.stroke
- paint.strokeWidth = strokeWidth
- drawCircle(center, outerPx - strokeWidth / 2, paint)
+ drawCircle(color, outerPx - strokeWidth / 2, center, style = Stroke(strokeWidth))
} else {
- val strokeWidth = RadioStrokeWidth.toPx().value
- paint.style = PaintingStyle.stroke
- paint.strokeWidth = strokeWidth
- drawCircle(center, outerPx - strokeWidth / 2, paint)
-
- val gapWidth = gap.toPx().value
- val circleRadius = outerPx - strokeWidth - gapWidth
+ drawCircle(color, outerPx - radioStroke.width / 2, center, style = radioStroke)
+ val circleRadius = outerPx - radioStroke.width - gapWidth
val innerCircleStrokeWidth = circleRadius - innerPx
- paint.strokeWidth = innerCircleStrokeWidth
- drawCircle(center, circleRadius - innerCircleStrokeWidth / 2, paint)
+ drawCircle(color, circleRadius - innerCircleStrokeWidth / 2, center,
+ style = Stroke(innerCircleStrokeWidth))
}
}
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Slider.kt b/ui/ui-material/src/main/java/androidx/ui/material/Slider.kt
index f691613..55533ae 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Slider.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Slider.kt
@@ -34,7 +34,7 @@
import androidx.ui.core.WithConstraints
import androidx.ui.core.gesture.pressIndicatorGestureFilter
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.animation.FlingConfig
import androidx.ui.foundation.animation.fling
import androidx.ui.foundation.gestures.DragDirection
@@ -42,10 +42,9 @@
import androidx.ui.foundation.shape.corner.CircleShape
import androidx.ui.geometry.Offset
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
-import androidx.ui.graphics.PaintingStyle
import androidx.ui.graphics.PointMode
import androidx.ui.graphics.StrokeCap
+import androidx.ui.graphics.painter.Stroke
import androidx.ui.layout.Spacer
import androidx.ui.layout.Stack
import androidx.ui.layout.fillMaxSize
@@ -58,7 +57,6 @@
import androidx.ui.semantics.accessibilityValue
import androidx.ui.unit.dp
import androidx.ui.unit.px
-import androidx.ui.unit.toRect
import androidx.ui.util.lerp
import kotlin.math.abs
@@ -180,7 +178,15 @@
val thumbSize = ThumbRadius * 2
val offset = (widthDp - thumbSize) * positionFraction
val center = Modifier.gravity(Alignment.CenterStart)
- Track(center.fillMaxSize(), color, positionFraction, tickFractions)
+
+ val trackStrokeWidth: Float
+ val thumbPx: Float
+ with(DensityAmbient.current) {
+ trackStrokeWidth = TrackHeight.toPx().value
+ thumbPx = ThumbRadius.toPx().value
+ }
+ val trackStroke = Stroke(trackStrokeWidth, cap = StrokeCap.round)
+ Track(center.fillMaxSize(), color, positionFraction, tickFractions, thumbPx, trackStroke)
Box(center.padding(start = offset)) {
Surface(
shape = CircleShape,
@@ -199,38 +205,36 @@
modifier: Modifier,
color: Color,
positionFraction: Float,
- tickFractions: List<Float>
+ tickFractions: List<Float>,
+ thumbPx: Float,
+ trackStroke: Stroke
) {
val activeTickColor = MaterialTheme.colors.onPrimary.copy(alpha = TickColorAlpha)
val inactiveTickColor = color.copy(alpha = TickColorAlpha)
- val paint = remember {
- Paint().apply {
- this.isAntiAlias = true
- this.strokeCap = StrokeCap.round
- this.style = PaintingStyle.stroke
- }
- }
- Canvas(modifier) {
- paint.strokeWidth = TrackHeight.toPx().value
- val parentRect = size.toRect()
- val thumbPx = ThumbRadius.toPx().value
- val centerHeight = size.height.value / 2
- val sliderStart = Offset(parentRect.left + thumbPx, centerHeight)
- val sliderMax = Offset(parentRect.right - thumbPx, centerHeight)
- paint.color = color.copy(alpha = InactiveTrackColorAlpha)
- drawLine(sliderStart, sliderMax, paint)
+ Canvas2(modifier) {
+ val sliderStart = Offset(thumbPx, center.dy)
+ val sliderMax = Offset(size.width - thumbPx, center.dy)
+ drawLine(
+ color.copy(alpha = InactiveTrackColorAlpha),
+ sliderStart,
+ sliderMax,
+ trackStroke
+ )
val sliderValue = Offset(
sliderStart.dx + (sliderMax.dx - sliderStart.dx) * positionFraction,
- centerHeight
+ center.dy
)
- paint.color = color
- drawLine(sliderStart, sliderValue, paint)
+
+ drawLine(color, sliderStart, sliderValue, trackStroke)
tickFractions.groupBy { it > positionFraction }.forEach { (afterFraction, list) ->
- paint.color = if (afterFraction) inactiveTickColor else activeTickColor
- val points = list.map {
- Offset(Offset.lerp(sliderStart, sliderMax, it).dx, centerHeight)
- }
- drawPoints(PointMode.points, points, paint)
+ drawPoints(
+ list.map {
+ Offset(Offset.lerp(sliderStart, sliderMax, it).dx, center.dy)
+ },
+ PointMode.points,
+ if (afterFraction) inactiveTickColor else activeTickColor,
+ trackStroke
+ )
}
}
}
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt b/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt
index c6e29a0..fb00b34 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt
@@ -21,14 +21,14 @@
import androidx.compose.Composable
import androidx.ui.core.DensityAmbient
import androidx.ui.core.Modifier
-import androidx.ui.core.DrawScope
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.gestures.DragDirection
import androidx.ui.foundation.selection.Toggleable
import androidx.ui.geometry.Offset
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
import androidx.ui.graphics.StrokeCap
+import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.Stroke
import androidx.ui.layout.Stack
import androidx.ui.layout.padding
import androidx.ui.layout.preferredSize
@@ -36,7 +36,6 @@
import androidx.ui.material.ripple.ripple
import androidx.ui.semantics.Semantics
import androidx.ui.unit.dp
-import androidx.ui.unit.px
/**
* A Switch is a two state toggleable component that provides on/off like options
@@ -110,40 +109,35 @@
} else {
MaterialTheme.colors.onSurface.copy(alpha = UncheckedTrackOpacity)
}
- Canvas(modifier.preferredSize(SwitchWidth, SwitchHeight)) {
- drawTrack(trackColor)
- drawThumb(thumbValue.value, thumbColor)
+
+ val trackStroke: Stroke
+ val trackWidth: Float
+ val thumbDiameter: Float
+ with(DensityAmbient.current) {
+ trackStroke = Stroke(width = TrackStrokeWidth.toPx().value, cap = StrokeCap.round)
+ trackWidth = TrackWidth.toPx().value
+ thumbDiameter = ThumbDiameter.toPx().value
+ }
+ Canvas2(modifier.preferredSize(SwitchWidth, SwitchHeight)) {
+ drawTrack(trackColor, trackWidth, trackStroke)
+ drawThumb(thumbValue.value, thumbDiameter, thumbColor)
}
}
-private fun DrawScope.drawTrack(trackColor: Color) {
- val paint = Paint().apply {
- isAntiAlias = true
- color = trackColor
- strokeCap = StrokeCap.round
- strokeWidth = TrackStrokeWidth.toPx().value
- }
-
- val strokeRadius = TrackStrokeWidth / 2
- val centerHeight = size.height / 2
-
+private fun CanvasScope.drawTrack(trackColor: Color, trackWidth: Float, stroke: Stroke) {
+ val strokeRadius = stroke.width / 2
drawLine(
- Offset(strokeRadius.toPx().value, centerHeight.value),
- Offset((TrackWidth - strokeRadius).toPx().value, centerHeight.value),
- paint
+ trackColor,
+ Offset(strokeRadius, center.dy),
+ Offset(trackWidth - strokeRadius, center.dy),
+ stroke
)
}
-private fun DrawScope.drawThumb(position: Float, thumbColor: Color) {
- val paint = Paint().apply {
- isAntiAlias = true
- color = thumbColor
- }
- val centerHeight = size.height / 2
- val thumbRadius = (ThumbDiameter / 2).toPx().value
- val x = position.px.value + thumbRadius
-
- drawCircle(Offset(x, centerHeight.value), thumbRadius, paint)
+private fun CanvasScope.drawThumb(position: Float, thumbDiameter: Float, thumbColor: Color) {
+ val thumbRadius = thumbDiameter / 2
+ val x = position + thumbRadius
+ drawCircle(thumbColor, thumbRadius, Offset(x, center.dy))
}
private const val CheckedTrackOpacity = 0.54f
diff --git a/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedDrawNode.kt b/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedDrawNode.kt
index df6f8bd..f6ed00f 100644
--- a/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedDrawNode.kt
+++ b/ui/ui-platform/src/main/java/androidx/ui/core/ModifiedDrawNode.kt
@@ -17,8 +17,8 @@
package androidx.ui.core
import androidx.ui.geometry.Offset
-import androidx.ui.geometry.RRect
import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Size
import androidx.ui.graphics.BlendMode
import androidx.ui.graphics.Canvas
import androidx.ui.graphics.ClipOp
@@ -87,9 +87,13 @@
override fun concat(matrix4: Matrix4) = canvas!!.concat(matrix4)
- override fun clipRect(rect: Rect, clipOp: ClipOp) = canvas!!.clipRect(rect, clipOp)
-
- override fun clipRRect(rrect: RRect) = canvas!!.clipRRect(rrect)
+ override fun clipRect(
+ left: Float,
+ top: Float,
+ right: Float,
+ bottom: Float,
+ clipOp: ClipOp
+ ) = canvas!!.clipRect(left, top, right, bottom, clipOp)
override fun clipPath(path: Path) = canvas!!.clipPath(path)
@@ -98,6 +102,23 @@
override fun drawRect(rect: Rect, paint: Paint) = canvas!!.drawRect(rect, paint)
+ override fun drawRect(left: Float, top: Float, right: Float, bottom: Float, paint: Paint) =
+ canvas!!.drawRect(left, top, right, bottom, paint)
+
+ override fun drawOval(left: Float, top: Float, right: Float, bottom: Float, paint: Paint) =
+ canvas!!.drawOval(left, top, right, bottom, paint)
+
+ override fun drawArc(
+ left: Float,
+ top: Float,
+ right: Float,
+ bottom: Float,
+ startAngle: Float,
+ sweepAngle: Float,
+ useCenter: Boolean,
+ paint: Paint
+ ) = canvas!!.drawArc(left, top, right, bottom, startAngle, sweepAngle, useCenter, paint)
+
override fun drawRoundRect(
left: Float,
top: Float,
@@ -113,21 +134,19 @@
override fun drawCircle(center: Offset, radius: Float, paint: Paint) =
canvas!!.drawCircle(center, radius, paint)
- override fun drawArc(
- rect: Rect,
- startAngle: Float,
- sweepAngle: Float,
- useCenter: Boolean,
- paint: Paint
- ) = canvas!!.drawArc(rect, startAngle, sweepAngle, useCenter, paint)
-
override fun drawPath(path: Path, paint: Paint) = canvas!!.drawPath(path, paint)
override fun drawImage(image: ImageAsset, topLeftOffset: Offset, paint: Paint) =
canvas!!.drawImage(image, topLeftOffset, paint)
- override fun drawImageRect(image: ImageAsset, src: Rect?, dst: Rect, paint: Paint) =
- canvas!!.drawImageRect(image, src, dst, paint)
+ override fun drawImageRect(
+ image: ImageAsset,
+ srcOffset: Offset,
+ srcSize: Size,
+ dstOffset: Offset,
+ dstSize: Size,
+ paint: Paint
+ ) = canvas!!.drawImageRect(image, srcOffset, srcSize, dstOffset, dstSize, paint)
override fun drawPicture(picture: Picture) = canvas!!.drawPicture(picture)
diff --git a/ui/ui-test/api/0.1.0-dev11.txt b/ui/ui-test/api/0.1.0-dev11.txt
index d719c1e..fcc20c2 100644
--- a/ui/ui-test/api/0.1.0-dev11.txt
+++ b/ui/ui-test/api/0.1.0-dev11.txt
@@ -53,7 +53,7 @@
method public static void assertShape-nbwoFSQ(android.graphics.Bitmap, androidx.ui.unit.Density density, androidx.ui.graphics.Shape shape, long shapeColor, long backgroundColor, androidx.ui.graphics.Shape backgroundShape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, float sizeX = width.toFloat().px, float sizeY = height.toFloat().px, float shapeSizeX = sizeX, float shapeSizeY = sizeY, float centerX = width.px / 2.0, float centerY = height.px / 2.0, float shapeOverlapPixelCount = 1.px);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(androidx.ui.test.SemanticsNodeInteraction);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(android.view.View);
- method public static boolean contains(androidx.ui.graphics.Path, androidx.ui.geometry.Offset offset);
+ method public static boolean contains-m3TnucA(androidx.ui.graphics.Path, long offset);
}
public final class CollectedSizes {
diff --git a/ui/ui-test/api/current.txt b/ui/ui-test/api/current.txt
index d719c1e..fcc20c2 100644
--- a/ui/ui-test/api/current.txt
+++ b/ui/ui-test/api/current.txt
@@ -53,7 +53,7 @@
method public static void assertShape-nbwoFSQ(android.graphics.Bitmap, androidx.ui.unit.Density density, androidx.ui.graphics.Shape shape, long shapeColor, long backgroundColor, androidx.ui.graphics.Shape backgroundShape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, float sizeX = width.toFloat().px, float sizeY = height.toFloat().px, float shapeSizeX = sizeX, float shapeSizeY = sizeY, float centerX = width.px / 2.0, float centerY = height.px / 2.0, float shapeOverlapPixelCount = 1.px);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(androidx.ui.test.SemanticsNodeInteraction);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(android.view.View);
- method public static boolean contains(androidx.ui.graphics.Path, androidx.ui.geometry.Offset offset);
+ method public static boolean contains-m3TnucA(androidx.ui.graphics.Path, long offset);
}
public final class CollectedSizes {
diff --git a/ui/ui-test/api/public_plus_experimental_0.1.0-dev11.txt b/ui/ui-test/api/public_plus_experimental_0.1.0-dev11.txt
index d719c1e..fcc20c2 100644
--- a/ui/ui-test/api/public_plus_experimental_0.1.0-dev11.txt
+++ b/ui/ui-test/api/public_plus_experimental_0.1.0-dev11.txt
@@ -53,7 +53,7 @@
method public static void assertShape-nbwoFSQ(android.graphics.Bitmap, androidx.ui.unit.Density density, androidx.ui.graphics.Shape shape, long shapeColor, long backgroundColor, androidx.ui.graphics.Shape backgroundShape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, float sizeX = width.toFloat().px, float sizeY = height.toFloat().px, float shapeSizeX = sizeX, float shapeSizeY = sizeY, float centerX = width.px / 2.0, float centerY = height.px / 2.0, float shapeOverlapPixelCount = 1.px);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(androidx.ui.test.SemanticsNodeInteraction);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(android.view.View);
- method public static boolean contains(androidx.ui.graphics.Path, androidx.ui.geometry.Offset offset);
+ method public static boolean contains-m3TnucA(androidx.ui.graphics.Path, long offset);
}
public final class CollectedSizes {
diff --git a/ui/ui-test/api/public_plus_experimental_current.txt b/ui/ui-test/api/public_plus_experimental_current.txt
index d719c1e..fcc20c2 100644
--- a/ui/ui-test/api/public_plus_experimental_current.txt
+++ b/ui/ui-test/api/public_plus_experimental_current.txt
@@ -53,7 +53,7 @@
method public static void assertShape-nbwoFSQ(android.graphics.Bitmap, androidx.ui.unit.Density density, androidx.ui.graphics.Shape shape, long shapeColor, long backgroundColor, androidx.ui.graphics.Shape backgroundShape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, float sizeX = width.toFloat().px, float sizeY = height.toFloat().px, float shapeSizeX = sizeX, float shapeSizeY = sizeY, float centerX = width.px / 2.0, float centerY = height.px / 2.0, float shapeOverlapPixelCount = 1.px);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(androidx.ui.test.SemanticsNodeInteraction);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(android.view.View);
- method public static boolean contains(androidx.ui.graphics.Path, androidx.ui.geometry.Offset offset);
+ method public static boolean contains-m3TnucA(androidx.ui.graphics.Path, long offset);
}
public final class CollectedSizes {
diff --git a/ui/ui-test/api/restricted_0.1.0-dev11.txt b/ui/ui-test/api/restricted_0.1.0-dev11.txt
index d719c1e..fcc20c2 100644
--- a/ui/ui-test/api/restricted_0.1.0-dev11.txt
+++ b/ui/ui-test/api/restricted_0.1.0-dev11.txt
@@ -53,7 +53,7 @@
method public static void assertShape-nbwoFSQ(android.graphics.Bitmap, androidx.ui.unit.Density density, androidx.ui.graphics.Shape shape, long shapeColor, long backgroundColor, androidx.ui.graphics.Shape backgroundShape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, float sizeX = width.toFloat().px, float sizeY = height.toFloat().px, float shapeSizeX = sizeX, float shapeSizeY = sizeY, float centerX = width.px / 2.0, float centerY = height.px / 2.0, float shapeOverlapPixelCount = 1.px);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(androidx.ui.test.SemanticsNodeInteraction);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(android.view.View);
- method public static boolean contains(androidx.ui.graphics.Path, androidx.ui.geometry.Offset offset);
+ method public static boolean contains-m3TnucA(androidx.ui.graphics.Path, long offset);
}
public final class CollectedSizes {
diff --git a/ui/ui-test/api/restricted_current.txt b/ui/ui-test/api/restricted_current.txt
index d719c1e..fcc20c2 100644
--- a/ui/ui-test/api/restricted_current.txt
+++ b/ui/ui-test/api/restricted_current.txt
@@ -53,7 +53,7 @@
method public static void assertShape-nbwoFSQ(android.graphics.Bitmap, androidx.ui.unit.Density density, androidx.ui.graphics.Shape shape, long shapeColor, long backgroundColor, androidx.ui.graphics.Shape backgroundShape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, float sizeX = width.toFloat().px, float sizeY = height.toFloat().px, float shapeSizeX = sizeX, float shapeSizeY = sizeY, float centerX = width.px / 2.0, float centerY = height.px / 2.0, float shapeOverlapPixelCount = 1.px);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(androidx.ui.test.SemanticsNodeInteraction);
method @RequiresApi(android.os.Build.VERSION_CODES.O) public static android.graphics.Bitmap captureToBitmap(android.view.View);
- method public static boolean contains(androidx.ui.graphics.Path, androidx.ui.geometry.Offset offset);
+ method public static boolean contains-m3TnucA(androidx.ui.graphics.Path, long offset);
}
public final class CollectedSizes {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/AnimationSynchronizationTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/AnimationSynchronizationTest.kt
index e68065c..7370875 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/AnimationSynchronizationTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/AnimationSynchronizationTest.kt
@@ -24,17 +24,16 @@
import androidx.compose.Composable
import androidx.compose.State
import androidx.compose.mutableStateOf
-import androidx.compose.remember
import androidx.test.espresso.Espresso.onIdle
import androidx.test.filters.LargeTest
import androidx.ui.animation.Transition
import androidx.ui.core.Modifier
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.drawBackground
-import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
import androidx.ui.layout.fillMaxSize
import androidx.ui.test.android.ComposeIdlingResource
import com.google.common.truth.Truth.assertThat
@@ -45,7 +44,8 @@
private const val animateFromX = 0f
private const val animateToX = 50f
-private val animatedRect = Rect.fromLTWH(0f, 0f, 50f, 50f)
+
+private val rectSize = Size(50.0f, 50.0f)
@LargeTest
class AnimationSynchronizationTest {
@@ -176,8 +176,6 @@
@Composable
private fun Ui(animationState: State<AnimationStates>) {
- val paint = remember { Paint().also { it.color = Color.Cyan } }
-
hasRecomposed = true
Box(modifier = Modifier.drawBackground(Color.Yellow).fillMaxSize()) {
hasRecomposed = true
@@ -187,9 +185,9 @@
onStateChangeFinished = { animationRunning = false }
) { state ->
hasRecomposed = true
- Canvas(modifier = Modifier.fillMaxSize()) {
+ Canvas2(modifier = Modifier.fillMaxSize()) {
recordedAnimatedValues.add(state[x])
- drawRect(animatedRect.translate(state[x], 0f), paint)
+ drawRect(Color.Cyan, Offset(state[x], 0f), rectSize)
}
}
}
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/FirstDrawTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/FirstDrawTest.kt
index fa112c6..015a77fb 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/FirstDrawTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/FirstDrawTest.kt
@@ -25,7 +25,7 @@
import androidx.ui.core.Modifier
import androidx.ui.core.setContent
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.graphics.Color
import androidx.ui.layout.fillMaxSize
import androidx.ui.test.android.AndroidComposeTestRule
@@ -46,7 +46,7 @@
fun waitsForFirstDraw() {
var drawn = false
testRule.setContent {
- Canvas(Modifier.fillMaxSize()) {
+ Canvas2(Modifier.fillMaxSize()) {
drawn = true
}
}
@@ -61,7 +61,7 @@
fun waitsForFirstDraw_withoutOnIdle() {
var drawn = false
testRule.setContent {
- Canvas(Modifier.fillMaxSize()) {
+ Canvas2(Modifier.fillMaxSize()) {
drawn = true
}
}
@@ -104,7 +104,7 @@
outOfBoundsView.setContent(Recomposer.current()) {
// If you see this box when running the test, the test is setup incorrectly
Box(Modifier, backgroundColor = Color.Yellow)
- Canvas(Modifier) {
+ Canvas2(Modifier) {
drawn = true
}
}
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/IsDisplayedTests.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/IsDisplayedTests.kt
index 31fbe9c..ffd3ff6 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/IsDisplayedTests.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/IsDisplayedTests.kt
@@ -24,12 +24,10 @@
import androidx.ui.core.Modifier
import androidx.ui.core.TestTag
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.Text
import androidx.ui.foundation.VerticalScroller
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
-import androidx.ui.graphics.PaintingStyle
import androidx.ui.layout.Column
import androidx.ui.layout.Row
import androidx.ui.layout.Stack
@@ -39,6 +37,7 @@
import androidx.ui.semantics.Semantics
import androidx.ui.text.TextStyle
import androidx.ui.unit.IntPx
+import androidx.ui.unit.Px
import androidx.ui.unit.dp
import androidx.ui.unit.ipx
import androidx.ui.unit.px
@@ -233,13 +232,10 @@
val drawRect = @Composable { color: Color ->
Semantics(container = true) {
- Canvas(Modifier.preferredSize(100.dp)) {
- val paint = Paint()
- paint.color = color
- paint.style = PaintingStyle.fill
- drawRect(size.toRect(), paint)
+ Canvas2(Modifier.preferredSize(100.dp)) {
+ drawRect(color)
- elementHeight = size.height
+ elementHeight = Px(size.height)
}
}
}
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/TestAnimationClockTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/TestAnimationClockTest.kt
index eebc64d..457ab16 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/TestAnimationClockTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/TestAnimationClockTest.kt
@@ -24,17 +24,16 @@
import androidx.compose.Recomposer
import androidx.compose.State
import androidx.compose.mutableStateOf
-import androidx.compose.remember
import androidx.test.espresso.Espresso.onIdle
import androidx.test.filters.MediumTest
import androidx.ui.animation.Transition
import androidx.ui.core.Modifier
import androidx.ui.foundation.Box
-import androidx.ui.foundation.Canvas
+import androidx.ui.foundation.Canvas2
import androidx.ui.foundation.drawBackground
-import androidx.ui.geometry.Rect
+import androidx.ui.geometry.Offset
+import androidx.ui.geometry.Size
import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
import androidx.ui.layout.fillMaxSize
import androidx.ui.test.android.ComposeIdlingResource
import com.google.common.truth.Truth.assertThat
@@ -169,9 +168,7 @@
@Composable
private fun Ui(animationState: State<AnimationStates>) {
- val paint = remember { Paint().also { it.color = Color.Cyan } }
- val rect = remember { Rect.fromLTWH(0f, 0f, 50f, 50f) }
-
+ val size = Size(50.0f, 50.0f)
hasRecomposed = true
Box(modifier = Modifier.drawBackground(Color.Yellow).fillMaxSize()) {
hasRecomposed = true
@@ -181,10 +178,10 @@
onStateChangeFinished = { animationRunning = false }
) { state ->
hasRecomposed = true
- Canvas(modifier = Modifier.fillMaxSize()) {
+ Canvas2(modifier = Modifier.fillMaxSize()) {
val xValue = state[x]
recordedAnimatedValues.add(xValue)
- drawRect(rect.translate(xValue, 0f), paint)
+ drawRect(Color.Cyan, Offset(xValue, 0.0f), size)
}
}
}
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/WaitingForOnCommitCallbackTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/WaitingForOnCommitCallbackTest.kt
new file mode 100644
index 0000000..03825af
--- /dev/null
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/WaitingForOnCommitCallbackTest.kt
@@ -0,0 +1,57 @@
+/*
+ * 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.ui.test
+
+import androidx.compose.getValue
+import androidx.compose.mutableStateOf
+import androidx.compose.onCommit
+import androidx.compose.setValue
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import java.util.concurrent.atomic.AtomicBoolean
+
+@MediumTest
+@RunWith(JUnit4::class)
+class WaitingForOnCommitCallbackTest {
+
+ @get:Rule
+ val composeTestRule = createComposeRule()
+
+ @Test
+ fun setContentAndWaitForIdleReleasesAfterOnCommitCallback() {
+ val atomicBoolean = AtomicBoolean(false)
+ var switch by mutableStateOf(true)
+ composeTestRule.setContent {
+ onCommit(switch) {
+ atomicBoolean.set(switch)
+ }
+ }
+
+ assertThat(atomicBoolean.get()).isTrue()
+
+ runOnIdleCompose {
+ switch = false
+ }
+ waitForIdle()
+
+ assertThat(atomicBoolean.get()).isFalse()
+ }
+}
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendClickTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendClickTest.kt
index 98b3c66..ab9d3c3 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendClickTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendClickTest.kt
@@ -24,26 +24,20 @@
import androidx.compose.Recomposer
import androidx.test.filters.MediumTest
import androidx.test.rule.ActivityTestRule
-import androidx.ui.core.DensityAmbient
-import androidx.ui.core.PointerEventPass
-import androidx.ui.core.PointerInputChange
-import androidx.ui.core.TestTag
import androidx.ui.core.changedToUp
import androidx.ui.core.pointerinput.PointerInputFilter
import androidx.ui.core.pointerinput.PointerInputModifier
import androidx.ui.core.setContent
-import androidx.ui.foundation.Box
import androidx.ui.graphics.Color
import androidx.ui.layout.Column
-import androidx.ui.layout.preferredSize
-import androidx.ui.semantics.Semantics
import androidx.ui.test.android.AndroidComposeTestRule
import androidx.ui.test.doGesture
import androidx.ui.test.findByTag
import androidx.ui.test.runOnIdleCompose
import androidx.ui.test.runOnUiThread
import androidx.ui.test.sendClick
-import androidx.ui.unit.IntPxSize
+import androidx.ui.test.util.ClickableTestBox
+import androidx.ui.test.util.RecordingFilter
import androidx.ui.unit.PxPosition
import androidx.ui.unit.px
import com.google.common.truth.Truth.assertThat
@@ -65,6 +59,17 @@
val position: PxPosition
)
+private class ClickRecorder(
+ private val componentIndex: Int,
+ private val recordedClicks: MutableList<ClickData>
+) : PointerInputModifier {
+ override val pointerInputFilter: PointerInputFilter = RecordingFilter {
+ if (it.changedToUp()) {
+ recordedClicks.add(ClickData(componentIndex, it.current.position!!))
+ }
+ }
+}
+
// The presence of an ActionBar follows from the theme set in AndroidManifest.xml
class ActivityWithActionBar : ComponentActivity() {
private lateinit var composeHolder: FrameLayout
@@ -88,58 +93,28 @@
}
}
-private fun <T : ComponentActivity> AndroidComposeTestRule<T>.setContent(
- recordedClicks: MutableList<ClickData>
-) {
+private fun AndroidComposeTestRule<*>.setContent(recordedClicks: MutableList<ClickData>) {
+ val content = @Composable {
+ Column {
+ repeat(numberOfSquares) { i ->
+ ClickableTestBox(
+ modifier = ClickRecorder(i, recordedClicks),
+ width = squareSize,
+ height = squareSize,
+ color = colors[i],
+ tag = "$tag$i"
+ )
+ }
+ }
+ }
+
val activity = activityTestRule.activity
if (activity is ActivityWithActionBar) {
runOnUiThread {
- activity.setContent { Ui(recordedClicks) }
+ activity.setContent(content)
}
} else {
- setContent { Ui(recordedClicks) }
- }
-}
-
-@Composable
-private fun Ui(recordedClicks: MutableList<ClickData>) {
- with(DensityAmbient.current) {
- Column {
- for (i in first..last) {
- TestTag(tag = "$tag$i") {
- Semantics(container = true) {
- val pointerInputModifier =
- object : PointerInputModifier {
- override val pointerInputFilter = object : PointerInputFilter() {
- override fun onPointerInput(
- changes: List<PointerInputChange>,
- pass: PointerEventPass,
- bounds: IntPxSize
- ): List<PointerInputChange> {
- if (pass == PointerEventPass.InitialDown) {
- changes.filter { it.changedToUp() }.forEach {
- recordedClicks.add(
- ClickData(i, it.current.position!!)
- )
- }
- }
- return changes
- }
-
- override fun onCancel() {
- // Do nothing
- }
- }
- }
- squareSize.toDp()
- Box(
- pointerInputModifier.preferredSize(squareSize.toDp()),
- backgroundColor = colors[i]
- )
- }
- }
- }
- }
+ setContent(content)
}
}
@@ -172,8 +147,8 @@
composeTestRule.setContent(recordedClicks)
// When I click each of the components
- findByTag("${tag}$first").doGesture { sendClick() }
- findByTag("${tag}$last").doGesture { sendClick() }
+ findByTag("$tag$first").doGesture { sendClick() }
+ findByTag("$tag$last").doGesture { sendClick() }
// Then each component has registered a click
runOnIdleCompose {
@@ -223,8 +198,8 @@
composeTestRule.setContent(recordedClicks)
// When I click each of the components
- findByTag("${tag}$first").doGesture { sendClick(config.position) }
- findByTag("${tag}$last").doGesture { sendClick(config.position) }
+ findByTag("$tag$first").doGesture { sendClick(config.position) }
+ findByTag("$tag$last").doGesture { sendClick(config.position) }
// Then each component has registered a click
runOnIdleCompose {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendDoubleClickTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendDoubleClickTest.kt
index 401abcd..049380a 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendDoubleClickTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendDoubleClickTest.kt
@@ -16,27 +16,18 @@
package androidx.ui.test.gesturescope
-import androidx.compose.Composable
import androidx.test.filters.MediumTest
-import androidx.ui.core.DensityAmbient
import androidx.ui.core.Modifier
-import androidx.ui.core.TestTag
import androidx.ui.core.gesture.doubleTapGestureFilter
-import androidx.ui.core.pointerinput.PointerInputModifier
-import androidx.ui.foundation.Box
-import androidx.ui.graphics.Color
-import androidx.ui.layout.Stack
-import androidx.ui.layout.preferredSize
-import androidx.ui.semantics.Semantics
import androidx.ui.test.android.AndroidInputDispatcher
import androidx.ui.test.createComposeRule
import androidx.ui.test.doGesture
import androidx.ui.test.findByTag
-import androidx.ui.test.runOnUiThread
+import androidx.ui.test.runOnIdleCompose
import androidx.ui.test.sendDoubleClick
+import androidx.ui.test.util.ClickableTestBox
import androidx.ui.test.util.PointerInputRecorder
import androidx.ui.test.util.assertTimestampsAreIncreasing
-import androidx.ui.unit.Px
import androidx.ui.unit.PxPosition
import androidx.ui.unit.milliseconds
import androidx.ui.unit.px
@@ -50,27 +41,8 @@
private val width = 200.px
private val height = 200.px
private val expectedDelay = 145.milliseconds
-
private const val tag = "widget"
-@Composable
-private fun Ui(onDoubleTap: (PxPosition) -> Unit, pointerInputRecorder: PointerInputModifier) {
- Stack {
- TestTag(tag) {
- Semantics(container = true) {
- with(DensityAmbient.current) {
- Box(
- Modifier.doubleTapGestureFilter(onDoubleTap)
- .plus(pointerInputRecorder)
- .preferredSize(width.toDp(), height.toDp()),
- backgroundColor = Color.Yellow
- )
- }
- }
- }
- }
-}
-
@MediumTest
class SendDoubleClickWithoutArgumentsTest {
@@ -95,13 +67,18 @@
// Given some content
recorder = PointerInputRecorder()
composeTestRule.setContent {
- Ui(onDoubleTap = this::recordDoubleClick, pointerInputRecorder = recorder)
+ ClickableTestBox(
+ Modifier.doubleTapGestureFilter(this::recordDoubleClick).plus(recorder),
+ width = width,
+ height = height,
+ tag = tag
+ )
}
// When we inject a double click
findByTag(tag).doGesture { sendDoubleClick() }
- runOnUiThread {
+ runOnIdleCompose {
// Then we record 1 double click
assertThat(recordedDoubleClicks).hasSize(1)
// at the expected position
@@ -126,12 +103,7 @@
@MediumTest
@RunWith(Parameterized::class)
class SendDoubleClickWithArgumentsTest(private val config: TestConfig) {
- data class TestConfig(
- val x: Px,
- val y: Px
- ) {
- val position get() = PxPosition(x, y)
- }
+ data class TestConfig(val position: PxPosition)
companion object {
@JvmStatic
@@ -140,15 +112,13 @@
return mutableListOf<TestConfig>().apply {
for (x in listOf(1.px, 33.px, 99.px)) {
for (y in listOf(1.px, 33.px, 99.px)) {
- add(TestConfig(x, y))
+ add(TestConfig(PxPosition(x, y)))
}
}
}
}
}
- private val tag = "widget"
-
@get:Rule
val composeTestRule = createComposeRule(disableTransitions = true)
@@ -157,7 +127,7 @@
disableDispatchInRealTime = true
)
- private lateinit var recorder: PointerInputRecorder
+ private val recorder = PointerInputRecorder()
private val recordedDoubleClicks = mutableListOf<PxPosition>()
private val expectedClickPosition = config.position
@@ -168,15 +138,19 @@
@Test
fun testDoubleClickOnPosition() {
// Given some content
- recorder = PointerInputRecorder()
composeTestRule.setContent {
- Ui(onDoubleTap = this::recordDoubleClick, pointerInputRecorder = recorder)
+ ClickableTestBox(
+ Modifier.doubleTapGestureFilter(this::recordDoubleClick).plus(recorder),
+ width = width,
+ height = height,
+ tag = tag
+ )
}
// When we inject a double click
findByTag(tag).doGesture { sendDoubleClick(config.position) }
- runOnUiThread {
+ runOnIdleCompose {
// Then we record 1 double click
assertThat(recordedDoubleClicks).hasSize(1)
// at the expected position
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendLongClickTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendLongClickTest.kt
index 8366cc4..87d315f7 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendLongClickTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendLongClickTest.kt
@@ -16,26 +16,20 @@
package androidx.ui.test.gesturescope
-import androidx.compose.Composable
import androidx.test.filters.MediumTest
import androidx.ui.core.Alignment
-import androidx.ui.core.DensityAmbient
import androidx.ui.core.Modifier
-import androidx.ui.core.TestTag
import androidx.ui.core.gesture.LongPressTimeout
import androidx.ui.core.gesture.longPressGestureFilter
-import androidx.ui.foundation.Box
-import androidx.ui.graphics.Color
import androidx.ui.layout.Stack
import androidx.ui.layout.fillMaxSize
-import androidx.ui.layout.preferredSize
import androidx.ui.layout.wrapContentSize
-import androidx.ui.semantics.Semantics
import androidx.ui.test.createComposeRule
import androidx.ui.test.doGesture
import androidx.ui.test.findByTag
-import androidx.ui.test.runOnUiThread
+import androidx.ui.test.runOnIdleCompose
import androidx.ui.test.sendLongClick
+import androidx.ui.test.util.ClickableTestBox
import androidx.ui.test.util.PointerInputRecorder
import androidx.ui.test.util.areAlmostEqualTo
import androidx.ui.test.util.assertOnlyLastEventIsUp
@@ -56,24 +50,6 @@
private val height = 100.px
private val expectedDuration = LongPressTimeout + 100.milliseconds
-@Composable
-private fun Ui(recorder: PointerInputRecorder, onLongPress: (PxPosition) -> Unit) {
- Stack(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
- TestTag(tag) {
- Semantics(container = true) {
- with(DensityAmbient.current) {
- Box(
- Modifier.longPressGestureFilter(onLongPress)
- .plus(recorder)
- .preferredSize(width.toDp(), height.toDp()),
- backgroundColor = Color.Yellow
- )
- }
- }
- }
- }
-}
-
/**
* Tests [sendLongClick] without arguments. Verifies that the click is in the middle
* of the component, that the gesture has a duration of 600 milliseconds and that all input
@@ -97,7 +73,16 @@
@Test
fun testLongClick() {
// Given some content
- composeTestRule.setContent { Ui(recorder, ::recordLongPress) }
+ composeTestRule.setContent {
+ Stack(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
+ ClickableTestBox(
+ modifier = Modifier.longPressGestureFilter(::recordLongPress).plus(recorder),
+ width = width,
+ height = height,
+ tag = tag
+ )
+ }
+ }
// When we inject a long click
findByTag(tag).doGesture { sendLongClick() }
@@ -106,7 +91,7 @@
assertThat(recordedLongClicks).hasSize(1)
// And all events are at the click location
- runOnUiThread {
+ runOnIdleCompose {
recorder.run {
assertTimestampsAreIncreasing()
assertOnlyLastEventIsUp()
@@ -156,7 +141,16 @@
@Test
fun testLongClick() {
// Given some content
- composeTestRule.setContent { Ui(recorder, ::recordLongPress) }
+ composeTestRule.setContent {
+ Stack(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
+ ClickableTestBox(
+ modifier = Modifier.longPressGestureFilter(::recordLongPress).plus(recorder),
+ width = width,
+ height = height,
+ tag = tag
+ )
+ }
+ }
// When we inject a long click
findByTag(tag).doGesture { sendLongClick(config.position) }
@@ -165,7 +159,7 @@
assertThat(recordedLongClicks).hasSize(1)
// And all events are at the click location
- runOnUiThread {
+ runOnIdleCompose {
recorder.run {
assertTimestampsAreIncreasing()
assertOnlyLastEventIsUp()
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendSwipeTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendSwipeTest.kt
index f966857..c701ed9 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendSwipeTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendSwipeTest.kt
@@ -20,29 +20,23 @@
import androidx.test.filters.MediumTest
import androidx.ui.core.Alignment
import androidx.ui.core.Modifier
-import androidx.ui.foundation.Box
-import androidx.ui.graphics.Color
import androidx.ui.layout.Stack
import androidx.ui.layout.fillMaxSize
-import androidx.ui.layout.preferredSize
import androidx.ui.layout.wrapContentSize
-import androidx.ui.semantics.Semantics
-import androidx.ui.semantics.testTag
import androidx.ui.test.createComposeRule
import androidx.ui.test.doGesture
import androidx.ui.test.findByTag
-import androidx.ui.test.runOnUiThread
+import androidx.ui.test.runOnIdleCompose
import androidx.ui.test.sendSwipeDown
import androidx.ui.test.sendSwipeLeft
import androidx.ui.test.sendSwipeRight
import androidx.ui.test.sendSwipeUp
+import androidx.ui.test.util.ClickableTestBox
import androidx.ui.test.util.PointerInputRecorder
import androidx.ui.test.util.assertOnlyLastEventIsUp
import androidx.ui.test.util.assertTimestampsAreIncreasing
-import androidx.ui.unit.dp
import com.google.common.collect.Ordering
import com.google.common.truth.Truth.assertThat
-import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
@@ -57,30 +51,20 @@
@get:Rule
val composeTestRule = createComposeRule(disableTransitions = true)
- private lateinit var recorder: PointerInputRecorder
-
- @Before
- fun setup() {
- recorder = PointerInputRecorder()
- }
+ private val recorder = PointerInputRecorder()
@Composable
- fun Ui(alignment: Modifier) {
- Stack(Modifier.fillMaxSize() + alignment) {
- Semantics(container = true, properties = { testTag = tag }) {
- Box(
- recorder.preferredSize(100.dp),
- backgroundColor = Color.Yellow
- )
- }
+ fun Ui(alignment: Alignment) {
+ Stack(Modifier.fillMaxSize().wrapContentSize(alignment)) {
+ ClickableTestBox(modifier = recorder, tag = tag)
}
}
@Test
fun swipeUp() {
- composeTestRule.setContent { Ui(Modifier.wrapContentSize(Alignment.TopStart)) }
+ composeTestRule.setContent { Ui(Alignment.TopStart) }
findByTag(tag).doGesture { sendSwipeUp() }
- runOnUiThread {
+ runOnIdleCompose {
recorder.run {
assertTimestampsAreIncreasing()
assertOnlyLastEventIsUp()
@@ -91,9 +75,9 @@
@Test
fun swipeDown() {
- composeTestRule.setContent { Ui(Modifier.wrapContentSize(Alignment.TopEnd)) }
+ composeTestRule.setContent { Ui(Alignment.TopEnd) }
findByTag(tag).doGesture { sendSwipeDown() }
- runOnUiThread {
+ runOnIdleCompose {
recorder.run {
assertTimestampsAreIncreasing()
assertOnlyLastEventIsUp()
@@ -104,9 +88,9 @@
@Test
fun swipeLeft() {
- composeTestRule.setContent { Ui(Modifier.wrapContentSize(Alignment.BottomEnd)) }
+ composeTestRule.setContent { Ui(Alignment.BottomEnd) }
findByTag(tag).doGesture { sendSwipeLeft() }
- runOnUiThread {
+ runOnIdleCompose {
recorder.run {
assertTimestampsAreIncreasing()
assertOnlyLastEventIsUp()
@@ -117,9 +101,9 @@
@Test
fun swipeRight() {
- composeTestRule.setContent { Ui(Modifier.wrapContentSize(Alignment.BottomStart)) }
+ composeTestRule.setContent { Ui(Alignment.BottomStart) }
findByTag(tag).doGesture { sendSwipeRight() }
- runOnUiThread {
+ runOnIdleCompose {
recorder.run {
assertTimestampsAreIncreasing()
assertOnlyLastEventIsUp()
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendSwipeVelocityTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendSwipeVelocityTest.kt
index 252823d..ef42a73 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendSwipeVelocityTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/gesturescope/SendSwipeVelocityTest.kt
@@ -16,28 +16,19 @@
package androidx.ui.test.gesturescope
-import androidx.compose.Composable
-import androidx.compose.remember
import androidx.test.filters.MediumTest
import androidx.ui.core.Alignment
-import androidx.ui.core.DensityAmbient
import androidx.ui.core.Modifier
-import androidx.ui.foundation.Canvas
-import androidx.ui.geometry.Rect
-import androidx.ui.graphics.Color
-import androidx.ui.graphics.Paint
import androidx.ui.layout.Stack
import androidx.ui.layout.fillMaxSize
-import androidx.ui.layout.preferredSize
import androidx.ui.layout.wrapContentSize
-import androidx.ui.semantics.Semantics
-import androidx.ui.semantics.testTag
import androidx.ui.test.android.AndroidInputDispatcher
import androidx.ui.test.createComposeRule
import androidx.ui.test.doGesture
import androidx.ui.test.findByTag
-import androidx.ui.test.runOnUiThread
+import androidx.ui.test.runOnIdleCompose
import androidx.ui.test.sendSwipeWithVelocity
+import androidx.ui.test.util.ClickableTestBox
import androidx.ui.test.util.PointerInputRecorder
import androidx.ui.test.util.assertOnlyLastEventIsUp
import androidx.ui.test.util.assertTimestampsAreIncreasing
@@ -51,7 +42,6 @@
import androidx.ui.unit.inMilliseconds
import androidx.ui.unit.px
import com.google.common.truth.Truth.assertThat
-import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
@@ -72,16 +62,11 @@
val eventPeriod: Long
)
- enum class Direction(
- val x0: (Rect) -> Float,
- val y0: (Rect) -> Float,
- val x1: (Rect) -> Float,
- val y1: (Rect) -> Float
- ) {
- LeftToRight({ it.left + 1 }, ::hmiddle, { it.right - 1 }, ::hmiddle),
- RightToLeft({ it.right - 1 }, ::hmiddle, { it.left + 1 }, ::hmiddle),
- TopToBottom(::vmiddle, { it.top + 1 }, ::vmiddle, { it.bottom - 1 }),
- BottomToTop(::vmiddle, { it.bottom - 1 }, ::vmiddle, { it.top + 1 })
+ enum class Direction(val from: PxPosition, val to: PxPosition) {
+ LeftToRight(PxPosition(boxStart, boxMiddle), PxPosition(boxEnd, boxMiddle)),
+ RightToLeft(PxPosition(boxEnd, boxMiddle), PxPosition(boxStart, boxMiddle)),
+ TopToBottom(PxPosition(boxMiddle, boxStart), PxPosition(boxMiddle, boxEnd)),
+ BottomToTop(PxPosition(boxMiddle, boxEnd), PxPosition(boxMiddle, boxStart))
}
companion object {
@@ -108,18 +93,16 @@
}
}
- private fun hmiddle(bounds: Rect): Float = (bounds.left + bounds.right) / 2
- private fun vmiddle(bounds: Rect): Float = (bounds.top + bounds.bottom) / 2
-
private const val tag = "widget"
+
+ private val boxSize = 500.px
+ private val boxStart = 1.px
+ private val boxMiddle = boxSize / 2
+ private val boxEnd = boxSize - 1.px
}
- private val x0 get() = config.direction.x0(bounds)
- private val y0 get() = config.direction.y0(bounds)
- private val x1 get() = config.direction.x1(bounds)
- private val y1 get() = config.direction.y1(bounds)
- private val start get() = PxPosition(x0.px, y0.px)
- private val end get() = PxPosition(x1.px, y1.px)
+ private val start get() = config.direction.from
+ private val end get() = config.direction.to
private val duration get() = config.duration
private val velocity get() = config.velocity
private val eventPeriod get() = config.eventPeriod
@@ -145,34 +128,21 @@
eventPeriodOverride = eventPeriod
)
- private lateinit var recorder: PointerInputRecorder
- private lateinit var bounds: Rect
-
- @Before
- fun setUp() {
- recorder = PointerInputRecorder()
- }
-
- @Composable
- fun Ui() {
- val paint = remember { Paint().apply { color = Color.Yellow } }
- Stack(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
- Semantics(container = true, properties = { testTag = tag }) {
- with(DensityAmbient.current) {
- Canvas(recorder.preferredSize(500.px.toDp())) {
- bounds = Rect(0f, 0f, size.width.value, size.height.value)
- drawRect(bounds, paint)
- }
- }
- }
- }
- }
+ private val recorder = PointerInputRecorder()
@Test
fun swipeWithVelocity() {
- composeTestRule.setContent { Ui() }
- findByTag(tag).doGesture { sendSwipeWithVelocity(start, end, velocity, duration) }
- runOnUiThread {
+ composeTestRule.setContent {
+ Stack(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
+ ClickableTestBox(recorder, boxSize, boxSize, tag = tag)
+ }
+ }
+
+ findByTag(tag).doGesture {
+ sendSwipeWithVelocity(start, end, velocity, duration)
+ }
+
+ runOnIdleCompose {
recorder.run {
val durationMs = duration.inMilliseconds()
val minimumEventSize = max(2, (durationMs / eventPeriod).toInt())
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/DelayTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/DelayTest.kt
index 592dc54..c792d9b 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/DelayTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/DelayTest.kt
@@ -28,7 +28,6 @@
import androidx.ui.unit.milliseconds
import com.google.common.truth.Truth.assertThat
import org.junit.After
-import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
@@ -95,14 +94,8 @@
disableDispatchInRealTime = true
)
- private lateinit var recorder: MotionEventRecorder
- private lateinit var subject: AndroidInputDispatcher
-
- @Before
- fun setUp() {
- recorder = MotionEventRecorder()
- subject = AndroidInputDispatcher(recorder::sendEvent)
- }
+ private val recorder = MotionEventRecorder()
+ private val subject = AndroidInputDispatcher(recorder::sendEvent)
@After
fun tearDown() {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendCancelTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendCancelTest.kt
index 6dd3329..711ecb1 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendCancelTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendCancelTest.kt
@@ -27,7 +27,6 @@
import androidx.ui.unit.px
import com.google.common.truth.Truth.assertThat
import org.junit.After
-import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
@@ -67,14 +66,8 @@
private val position = PxPosition(config.x.px, config.y.px)
- private lateinit var recorder: MotionEventRecorder
- private lateinit var subject: AndroidInputDispatcher
-
- @Before
- fun setUp() {
- recorder = MotionEventRecorder()
- subject = AndroidInputDispatcher(recorder::sendEvent)
- }
+ private val recorder = MotionEventRecorder()
+ private val subject = AndroidInputDispatcher(recorder::sendEvent)
@After
fun tearDown() {
@@ -111,7 +104,7 @@
disableDispatchInRealTime = true
)
- private val subject: AndroidInputDispatcher = AndroidInputDispatcher {}
+ private val subject = AndroidInputDispatcher {}
@Test
fun testCancelAfterUp() {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendClickTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendClickTest.kt
index c1e19ea..d8ab709 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendClickTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendClickTest.kt
@@ -26,7 +26,6 @@
import androidx.ui.unit.px
import com.google.common.truth.Truth.assertThat
import org.junit.After
-import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
@@ -64,14 +63,8 @@
private val eventPeriod = 10L
private val position = PxPosition(config.x.px, config.y.px)
- private lateinit var recorder: MotionEventRecorder
- private lateinit var subject: AndroidInputDispatcher
-
- @Before
- fun setUp() {
- recorder = MotionEventRecorder()
- subject = AndroidInputDispatcher(recorder::sendEvent)
- }
+ private val recorder = MotionEventRecorder()
+ private val subject = AndroidInputDispatcher(recorder::sendEvent)
@After
fun tearDown() {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendDownTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendDownTest.kt
index f1cda6b..dd6eef6 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendDownTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendDownTest.kt
@@ -26,7 +26,6 @@
import androidx.ui.unit.px
import com.google.common.truth.Truth.assertThat
import org.junit.After
-import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
@@ -63,14 +62,8 @@
private val position = PxPosition(config.x.px, config.y.px)
- private lateinit var recorder: MotionEventRecorder
- private lateinit var subject: AndroidInputDispatcher
-
- @Before
- fun setUp() {
- recorder = MotionEventRecorder()
- subject = AndroidInputDispatcher(recorder::sendEvent)
- }
+ private val recorder = MotionEventRecorder()
+ private val subject = AndroidInputDispatcher(recorder::sendEvent)
@After
fun tearDown() {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendMoveTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendMoveTest.kt
index f8ab469..6a5cc38 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendMoveTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendMoveTest.kt
@@ -27,7 +27,6 @@
import androidx.ui.unit.px
import com.google.common.truth.Truth.assertThat
import org.junit.After
-import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
@@ -67,14 +66,8 @@
private val position = PxPosition(config.x.px, config.y.px)
- private lateinit var recorder: MotionEventRecorder
- private lateinit var subject: AndroidInputDispatcher
-
- @Before
- fun setUp() {
- recorder = MotionEventRecorder()
- subject = AndroidInputDispatcher(recorder::sendEvent)
- }
+ private val recorder = MotionEventRecorder()
+ private val subject = AndroidInputDispatcher(recorder::sendEvent)
@After
fun tearDown() {
@@ -111,7 +104,7 @@
disableDispatchInRealTime = true
)
- private val subject: AndroidInputDispatcher = AndroidInputDispatcher {}
+ private val subject = AndroidInputDispatcher {}
@Test
fun testMoveAfterUp() {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendSwipeFunctionTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendSwipeFunctionTest.kt
index e73ef56..44ce4c4 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendSwipeFunctionTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendSwipeFunctionTest.kt
@@ -108,14 +108,8 @@
disableDispatchInRealTime = true
)
- private lateinit var recorder: MotionEventRecorder
- private lateinit var subject: AndroidInputDispatcher
-
- @Before
- fun setUp() {
- recorder = MotionEventRecorder()
- subject = AndroidInputDispatcher(recorder::sendEvent)
- }
+ private val recorder = MotionEventRecorder()
+ private val subject = AndroidInputDispatcher(recorder::sendEvent)
@After
fun tearDown() {
@@ -194,14 +188,11 @@
disableDispatchInRealTime = true
)
- private lateinit var recorder: MotionEventRecorder
- private lateinit var subject: AndroidInputDispatcher
+ private val recorder = MotionEventRecorder()
+ private val subject = AndroidInputDispatcher(recorder::sendEvent)
@Before
fun setUp() {
- recorder = MotionEventRecorder()
- subject = AndroidInputDispatcher(recorder::sendEvent)
-
require(config.keyTimes.distinct() == config.keyTimes.distinct().sorted()) {
"keyTimes needs to be sorted, not ${config.keyTimes}"
}
@@ -293,14 +284,11 @@
private val keyTimes get() = config.keyTimes
private val eventPeriod = config.eventPeriod
- private lateinit var recorder: MotionEventRecorder
- private lateinit var subject: AndroidInputDispatcher
+ private val recorder = MotionEventRecorder()
+ private val subject = AndroidInputDispatcher(recorder::sendEvent)
@Before
fun setUp() {
- recorder = MotionEventRecorder()
- subject = AndroidInputDispatcher(recorder::sendEvent)
-
require(config.keyTimes.distinct() == config.keyTimes.distinct().sorted()) {
"keyTimes needs to be sorted, not ${config.keyTimes}"
}
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendSwipeLineTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendSwipeLineTest.kt
index b893eb0..a91587c 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendSwipeLineTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendSwipeLineTest.kt
@@ -31,7 +31,6 @@
import androidx.ui.unit.px
import com.google.common.truth.Truth.assertThat
import org.junit.After
-import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
@@ -75,14 +74,8 @@
private val duration get() = config.duration
private val eventPeriod = config.eventPeriod
- private lateinit var recorder: MotionEventRecorder
- private lateinit var subject: AndroidInputDispatcher
-
- @Before
- fun setUp() {
- recorder = MotionEventRecorder()
- subject = AndroidInputDispatcher(recorder::sendEvent)
- }
+ private val recorder = MotionEventRecorder()
+ private val subject = AndroidInputDispatcher(recorder::sendEvent)
@After
fun tearDown() {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendUpTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendUpTest.kt
index 6d584ed..d1606c2 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendUpTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/inputdispatcher/SendUpTest.kt
@@ -27,7 +27,6 @@
import androidx.ui.unit.px
import com.google.common.truth.Truth.assertThat
import org.junit.After
-import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TestRule
@@ -67,14 +66,8 @@
private val position = PxPosition(config.x.px, config.y.px)
- private lateinit var recorder: MotionEventRecorder
- private lateinit var subject: AndroidInputDispatcher
-
- @Before
- fun setUp() {
- recorder = MotionEventRecorder()
- subject = AndroidInputDispatcher(recorder::sendEvent)
- }
+ private val recorder = MotionEventRecorder()
+ private val subject = AndroidInputDispatcher(recorder::sendEvent)
@After
fun tearDown() {
@@ -111,7 +104,7 @@
disableDispatchInRealTime = true
)
- private val subject: AndroidInputDispatcher = AndroidInputDispatcher {}
+ private val subject = AndroidInputDispatcher {}
@Test
fun testUpAfterUp() {
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendCancelTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendCancelTest.kt
index b6c4ee7..355ff67 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendCancelTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendCancelTest.kt
@@ -17,7 +17,6 @@
package androidx.ui.test.partialgesturescope
import androidx.test.filters.MediumTest
-import androidx.ui.graphics.Color
import androidx.ui.test.GestureToken
import androidx.ui.test.android.AndroidInputDispatcher
import androidx.ui.test.createComposeRule
@@ -39,9 +38,6 @@
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
-private val width = 200.px
-private val height = 200.px
-
private const val tag = "widget"
@MediumTest
@@ -81,7 +77,7 @@
// Given some content
recorder = PointerInputRecorder()
composeTestRule.setContent {
- ClickableTestBox(width, height, Color.Yellow, tag, recorder)
+ ClickableTestBox(recorder, tag = tag)
}
// When we inject a down event followed by a cancel event
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendDownTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendDownTest.kt
index c56472e..ec8d112 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendDownTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendDownTest.kt
@@ -17,7 +17,6 @@
package androidx.ui.test.partialgesturescope
import androidx.test.filters.MediumTest
-import androidx.ui.graphics.Color
import androidx.ui.test.GestureToken
import androidx.ui.test.android.AndroidInputDispatcher
import androidx.ui.test.createComposeRule
@@ -38,9 +37,6 @@
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
-private val width = 200.px
-private val height = 200.px
-
private const val tag = "widget"
@MediumTest
@@ -78,7 +74,7 @@
// Given some content
recorder = PointerInputRecorder()
composeTestRule.setContent {
- ClickableTestBox(width, height, Color.Yellow, tag, recorder)
+ ClickableTestBox(recorder, tag = tag)
}
// When we inject a down event
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendMoveByTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendMoveByTest.kt
index acc538a..1a3d87d 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendMoveByTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendMoveByTest.kt
@@ -17,7 +17,6 @@
package androidx.ui.test.partialgesturescope
import androidx.test.filters.MediumTest
-import androidx.ui.graphics.Color
import androidx.ui.test.GestureToken
import androidx.ui.test.android.AndroidInputDispatcher
import androidx.ui.test.createComposeRule
@@ -40,9 +39,6 @@
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
-private val width = 200.px
-private val height = 200.px
-
private const val tag = "widget"
@MediumTest
@@ -81,7 +77,7 @@
// Given some content
recorder = PointerInputRecorder()
composeTestRule.setContent {
- ClickableTestBox(width, height, Color.Yellow, tag, recorder)
+ ClickableTestBox(recorder, tag = tag)
}
// When we inject a down event followed by a move event
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendMoveToTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendMoveToTest.kt
index 86092f5..d0e176f 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendMoveToTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendMoveToTest.kt
@@ -17,7 +17,6 @@
package androidx.ui.test.partialgesturescope
import androidx.test.filters.MediumTest
-import androidx.ui.graphics.Color
import androidx.ui.test.GestureToken
import androidx.ui.test.android.AndroidInputDispatcher
import androidx.ui.test.createComposeRule
@@ -40,9 +39,6 @@
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
-private val width = 200.px
-private val height = 200.px
-
private const val tag = "widget"
@MediumTest
@@ -81,7 +77,7 @@
// Given some content
recorder = PointerInputRecorder()
composeTestRule.setContent {
- ClickableTestBox(width, height, Color.Yellow, tag, recorder)
+ ClickableTestBox(recorder, tag = tag)
}
// When we inject a down event followed by a move event
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendUpTest.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendUpTest.kt
index 6bc448b..33b8788 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendUpTest.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/partialgesturescope/SendUpTest.kt
@@ -17,7 +17,6 @@
package androidx.ui.test.partialgesturescope
import androidx.test.filters.MediumTest
-import androidx.ui.graphics.Color
import androidx.ui.test.GestureToken
import androidx.ui.test.android.AndroidInputDispatcher
import androidx.ui.test.createComposeRule
@@ -40,9 +39,6 @@
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
-private val width = 200.px
-private val height = 200.px
-
private const val tag = "widget"
@MediumTest
@@ -82,7 +78,7 @@
// Given some content
recorder = PointerInputRecorder()
composeTestRule.setContent {
- ClickableTestBox(width, height, Color.Yellow, tag, recorder)
+ ClickableTestBox(recorder, tag = tag)
}
// When we inject a down event followed by an up event
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/util/ClickableTestBox.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/util/ClickableTestBox.kt
index ec46184..e6ea4f2 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/util/ClickableTestBox.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/util/ClickableTestBox.kt
@@ -18,26 +18,36 @@
import androidx.compose.Composable
import androidx.ui.core.DensityAmbient
-import androidx.ui.core.pointerinput.PointerInputModifier
+import androidx.ui.core.Modifier
import androidx.ui.foundation.Box
import androidx.ui.graphics.Color
import androidx.ui.layout.size
import androidx.ui.semantics.Semantics
import androidx.ui.semantics.testTag
+import androidx.ui.test.util.ClickableTestBox.defaultColor
+import androidx.ui.test.util.ClickableTestBox.defaultSize
+import androidx.ui.test.util.ClickableTestBox.defaultTag
import androidx.ui.unit.Px
+import androidx.ui.unit.px
+
+object ClickableTestBox {
+ val defaultSize = 100.px
+ val defaultColor = Color.Yellow
+ const val defaultTag = "ClickableTestBox"
+}
@Composable
fun ClickableTestBox(
- width: Px,
- height: Px,
- color: Color,
- tag: String,
- pointerInputModifier: PointerInputModifier
+ modifier: Modifier = Modifier,
+ width: Px = defaultSize,
+ height: Px = defaultSize,
+ color: Color = defaultColor,
+ tag: String = defaultTag
) {
Semantics(container = true, properties = { testTag = tag }) {
with(DensityAmbient.current) {
Box(
- modifier = pointerInputModifier.size(width.toDp(), height.toDp()),
+ modifier = modifier.size(width.toDp(), height.toDp()),
backgroundColor = color
)
}
diff --git a/ui/ui-test/src/androidTest/java/androidx/ui/test/util/PointerInputs.kt b/ui/ui-test/src/androidTest/java/androidx/ui/test/util/PointerInputs.kt
index 2321adc..51b360e 100644
--- a/ui/ui-test/src/androidTest/java/androidx/ui/test/util/PointerInputs.kt
+++ b/ui/ui-test/src/androidTest/java/androidx/ui/test/util/PointerInputs.kt
@@ -46,26 +46,29 @@
private val velocityTracker = VelocityTracker()
val recordedVelocity get() = velocityTracker.calculateVelocity()
- override val pointerInputFilter: PointerInputFilter =
- object : PointerInputFilter() {
- override fun onPointerInput(
- changes: List<PointerInputChange>,
- pass: PointerEventPass,
- bounds: IntPxSize
- ): List<PointerInputChange> {
- if (pass == PointerEventPass.InitialDown) {
- changes.forEach {
- _events.add(DataPoint(it.id, it.current))
- velocityTracker.addPosition(it.current.uptime!!, it.current.position!!)
- }
- }
- return changes
- }
+ override val pointerInputFilter = RecordingFilter {
+ _events.add(DataPoint(it.id, it.current))
+ velocityTracker.addPosition(it.current.uptime!!, it.current.position!!)
+ }
+}
- override fun onCancel() {
- // Do nothing
+class RecordingFilter(private val record: (PointerInputChange) -> Unit) : PointerInputFilter() {
+ override fun onPointerInput(
+ changes: List<PointerInputChange>,
+ pass: PointerEventPass,
+ bounds: IntPxSize
+ ): List<PointerInputChange> {
+ if (pass == PointerEventPass.InitialDown) {
+ changes.forEach {
+ record(it)
}
}
+ return changes
+ }
+
+ override fun onCancel() {
+ // Do nothing
+ }
}
fun Uptime.inMilliseconds(): Long = nanoseconds / 1_000_000
diff --git a/ui/ui-test/src/main/java/androidx/ui/test/android/SynchronizedTreeCollector.kt b/ui/ui-test/src/main/java/androidx/ui/test/android/SynchronizedTreeCollector.kt
index 988494c..7fd58ff 100644
--- a/ui/ui-test/src/main/java/androidx/ui/test/android/SynchronizedTreeCollector.kt
+++ b/ui/ui-test/src/main/java/androidx/ui/test/android/SynchronizedTreeCollector.kt
@@ -19,11 +19,17 @@
import android.app.Activity
import android.content.Context
import android.content.ContextWrapper
+import android.view.Choreographer
+import androidx.compose.onCommit
import androidx.lifecycle.Lifecycle
import androidx.test.espresso.Espresso
import androidx.ui.core.AndroidOwner
import androidx.ui.core.semantics.SemanticsNode
import androidx.ui.core.semantics.getAllSemanticsNodes
+import androidx.ui.test.isOnUiThread
+import androidx.ui.test.runOnUiThread
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
/**
* Collects all [AndroidOwner]s that are part of the currently visible window.
@@ -69,6 +75,19 @@
internal fun waitForIdle() {
registerComposeWithEspresso()
Espresso.onIdle()
+ waitForOnCommitCallbacks()
+ }
+
+ /**
+ * Waits for all scheduled [onCommit] callbacks to be executed.
+ */
+ private fun waitForOnCommitCallbacks() {
+ require(!isOnUiThread())
+ val latch = CountDownLatch(1)
+ runOnUiThread {
+ Choreographer.getInstance().postFrameCallbackDelayed({ latch.countDown() }, 1)
+ }
+ latch.await(1, TimeUnit.SECONDS)
}
}
diff --git a/ui/ui-unit/api/0.1.0-dev11.txt b/ui/ui-unit/api/0.1.0-dev11.txt
index 87399c8..4df20e4 100644
--- a/ui/ui-unit/api/0.1.0-dev11.txt
+++ b/ui/ui-unit/api/0.1.0-dev11.txt
@@ -465,7 +465,7 @@
method public static inline operator float times-Ndu7NvY(int, float other);
method public static inline operator float times-kxDXtn8(float, float other);
method public static androidx.ui.unit.PxBounds toBounds(androidx.ui.unit.PxSize);
- method public static inline androidx.ui.geometry.Offset toOffset(androidx.ui.unit.PxPosition);
+ method public static inline long toOffset(androidx.ui.unit.PxPosition);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxBounds);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxSize);
method public static androidx.ui.unit.PxSize toSize(androidx.ui.unit.PxBounds);
diff --git a/ui/ui-unit/api/current.txt b/ui/ui-unit/api/current.txt
index 87399c8..4df20e4 100644
--- a/ui/ui-unit/api/current.txt
+++ b/ui/ui-unit/api/current.txt
@@ -465,7 +465,7 @@
method public static inline operator float times-Ndu7NvY(int, float other);
method public static inline operator float times-kxDXtn8(float, float other);
method public static androidx.ui.unit.PxBounds toBounds(androidx.ui.unit.PxSize);
- method public static inline androidx.ui.geometry.Offset toOffset(androidx.ui.unit.PxPosition);
+ method public static inline long toOffset(androidx.ui.unit.PxPosition);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxBounds);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxSize);
method public static androidx.ui.unit.PxSize toSize(androidx.ui.unit.PxBounds);
diff --git a/ui/ui-unit/api/public_plus_experimental_0.1.0-dev11.txt b/ui/ui-unit/api/public_plus_experimental_0.1.0-dev11.txt
index 87399c8..4df20e4 100644
--- a/ui/ui-unit/api/public_plus_experimental_0.1.0-dev11.txt
+++ b/ui/ui-unit/api/public_plus_experimental_0.1.0-dev11.txt
@@ -465,7 +465,7 @@
method public static inline operator float times-Ndu7NvY(int, float other);
method public static inline operator float times-kxDXtn8(float, float other);
method public static androidx.ui.unit.PxBounds toBounds(androidx.ui.unit.PxSize);
- method public static inline androidx.ui.geometry.Offset toOffset(androidx.ui.unit.PxPosition);
+ method public static inline long toOffset(androidx.ui.unit.PxPosition);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxBounds);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxSize);
method public static androidx.ui.unit.PxSize toSize(androidx.ui.unit.PxBounds);
diff --git a/ui/ui-unit/api/public_plus_experimental_current.txt b/ui/ui-unit/api/public_plus_experimental_current.txt
index 87399c8..4df20e4 100644
--- a/ui/ui-unit/api/public_plus_experimental_current.txt
+++ b/ui/ui-unit/api/public_plus_experimental_current.txt
@@ -465,7 +465,7 @@
method public static inline operator float times-Ndu7NvY(int, float other);
method public static inline operator float times-kxDXtn8(float, float other);
method public static androidx.ui.unit.PxBounds toBounds(androidx.ui.unit.PxSize);
- method public static inline androidx.ui.geometry.Offset toOffset(androidx.ui.unit.PxPosition);
+ method public static inline long toOffset(androidx.ui.unit.PxPosition);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxBounds);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxSize);
method public static androidx.ui.unit.PxSize toSize(androidx.ui.unit.PxBounds);
diff --git a/ui/ui-unit/api/restricted_0.1.0-dev11.txt b/ui/ui-unit/api/restricted_0.1.0-dev11.txt
index 87399c8..4df20e4 100644
--- a/ui/ui-unit/api/restricted_0.1.0-dev11.txt
+++ b/ui/ui-unit/api/restricted_0.1.0-dev11.txt
@@ -465,7 +465,7 @@
method public static inline operator float times-Ndu7NvY(int, float other);
method public static inline operator float times-kxDXtn8(float, float other);
method public static androidx.ui.unit.PxBounds toBounds(androidx.ui.unit.PxSize);
- method public static inline androidx.ui.geometry.Offset toOffset(androidx.ui.unit.PxPosition);
+ method public static inline long toOffset(androidx.ui.unit.PxPosition);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxBounds);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxSize);
method public static androidx.ui.unit.PxSize toSize(androidx.ui.unit.PxBounds);
diff --git a/ui/ui-unit/api/restricted_current.txt b/ui/ui-unit/api/restricted_current.txt
index 87399c8..4df20e4 100644
--- a/ui/ui-unit/api/restricted_current.txt
+++ b/ui/ui-unit/api/restricted_current.txt
@@ -465,7 +465,7 @@
method public static inline operator float times-Ndu7NvY(int, float other);
method public static inline operator float times-kxDXtn8(float, float other);
method public static androidx.ui.unit.PxBounds toBounds(androidx.ui.unit.PxSize);
- method public static inline androidx.ui.geometry.Offset toOffset(androidx.ui.unit.PxPosition);
+ method public static inline long toOffset(androidx.ui.unit.PxPosition);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxBounds);
method public static androidx.ui.geometry.Rect toRect(androidx.ui.unit.PxSize);
method public static androidx.ui.unit.PxSize toSize(androidx.ui.unit.PxBounds);
diff --git a/ui/ui-vector/build.gradle b/ui/ui-vector/build.gradle
index 6d80f94..3b3c65cf 100644
--- a/ui/ui-vector/build.gradle
+++ b/ui/ui-vector/build.gradle
@@ -32,14 +32,8 @@
kotlinPlugin project(path: ":compose:compose-compiler")
api project(':ui:ui-core')
- implementation "androidx.collection:collection:1.0.0"
api project(":compose:compose-runtime")
implementation (KOTLIN_STDLIB)
-
- // TODO: Non-Kotlin dependency, move to Android-specific code
-// implementation "androidx.collection:collection:1.0.0-alpha01"
- // TODO: Non-Kotlin dependency, move to Android-specific code
- implementation "androidx.core:core:1.0.0"
}
androidx {