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
+ *  &#64;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:
+ *  &#64;ChecksSdkIntAtLeast(parameter = 0, lambda = 1)
+ *  inline fun fromApi(value: Int, action: () -> Unit) {
+ *      if (Build.VERSION.SDK_INT >= value) {
+ *          action()
+ *      }
+ *  }
+ *
+ *  // Kotlin property:
+ *  &#64;get:ChecksSdkIntAtLeast(api = Build.VERSION_CODES.GINGERBREAD)
+ *  val isGingerbread: Boolean
+ *     get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD
+ *
+ *  // Java field:
+ *  &#64;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 {